Re: [WPF] Как сделать контрол
От: Vladek Россия Github
Дата: 14.11.09 18:39
Оценка: 2 (1)
Здравствуйте, dmitry_npi, Вы писали:

_>Теперь я хочу сделать отдельный custom control, унаследованный от ItemsControl и эти установки свойств перенести в стиль. Создал библиотеку контролов, добавил контрол, унаследовал его от ItemsControl, в ResourceDictionary (Generic.xaml) добавил style setter'ы. В окне теперь инстанцирую этот контрол.

_>Но эффект не тот же самый! Как мне кажется, в силу того, что в конструкторе контрола прописано
_>
_>DefaultStyleKeyProperty.OverrideMetadata(typeof(Band), new FrameworkPropertyMetadata(typeof(Band)));
_>

_>ВСЕ элементы стиля ItemsControl'а заменяются моим стилем. А там видать очень еще много всего, и мой контрол выглядит в итоге пустым. Подскажите, как правильно сделать, чтобы мой контрол сохранял стили своего предка, и при этом добавлял свой. Есть атрибут BasedOn, но не врубился как его использовать...

Как создать базовый стиль для нового контрола, пять простых шагов:

  1. В статическом конструкторе контрола разместить следующий код:
    DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));

    Это значит, что базовый стиль для контрола должен искаться по ключу {x:Type my:CustomControl}, если стиль не задан явно.
  2. В файле AssemblyInfo.cs разместить следующий аттрибут:
    [assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]

    Это значит: None — что стилей для конкретных тем оформления Windows нет (если есть заменить на SourceAssembly, если они в этой же сборке, или на ExternalAssembly, если они в сборках с шаблоном имени <SourceAssemblyName>.<Theme-Name>.dll), SourceAssembly — базовый стиль контрола находится в текущей сборке.
  3. Создать в проекте с контролом папку Themes, в которой разместить файл Generic.xaml с базовым стилем контрола. Стили для конкретных тем оформления размещаются в файлах с шаблоном имени <Theme-Name>.<Color-Scheme>.xaml, например Aero.NormalColor.xaml, Classic.xaml — исключение.
  4. Ключи для всех ресурсов должны иметь следующий вид:
    x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type my:CustomControl}, ResourceId=StringResourceName}"

    Это нужно для того, чтобы не было совпадений с ключами из других сборок, поэтому обычный строковый идентификатор StringResourceName дополняется ссылкой на тип контрола {x:Type my:CustomControl} — это обеспечивает уникальность ключа для ресурса.
  5. Стиль контрола оформляется так:
    <Style x:Key="{x:Type my:CustomControl}" TargetType="{x:Type my:CustomControl}"/>
enum Bool { True, False, FileNotFound }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.