Здравствуйте, dmitry_npi, Вы писали:
_>Теперь я хочу сделать отдельный custom control, унаследованный от ItemsControl и эти установки свойств перенести в стиль. Создал библиотеку контролов, добавил контрол, унаследовал его от ItemsControl, в ResourceDictionary (Generic.xaml) добавил style setter'ы. В окне теперь инстанцирую этот контрол.
_>Но эффект не тот же самый! Как мне кажется, в силу того, что в конструкторе контрола прописано
_>_>DefaultStyleKeyProperty.OverrideMetadata(typeof(Band), new FrameworkPropertyMetadata(typeof(Band)));
_>
_>ВСЕ элементы стиля ItemsControl'а заменяются моим стилем. А там видать очень еще много всего, и мой контрол выглядит в итоге пустым. Подскажите, как правильно сделать, чтобы мой контрол сохранял стили своего предка, и при этом добавлял свой. Есть атрибут BasedOn, но не врубился как его использовать...
Как создать базовый стиль для нового контрола, пять простых шагов:
В статическом конструкторе контрола разместить следующий код:
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));
Это значит, что базовый стиль для контрола должен искаться по ключу {x:Type my:CustomControl}, если стиль не задан явно.
В файле AssemblyInfo.cs разместить следующий аттрибут:
[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
Это значит: None — что стилей для конкретных тем оформления Windows нет (если есть заменить на SourceAssembly, если они в этой же сборке, или на ExternalAssembly, если они в сборках с шаблоном имени <SourceAssemblyName>.<Theme-Name>.dll), SourceAssembly — базовый стиль контрола находится в текущей сборке.
Создать в проекте с контролом папку Themes, в которой разместить файл Generic.xaml с базовым стилем контрола. Стили для конкретных тем оформления размещаются в файлах с шаблоном имени <Theme-Name>.<Color-Scheme>.xaml, например Aero.NormalColor.xaml, Classic.xaml — исключение.
Ключи для всех ресурсов должны иметь следующий вид:
x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type my:CustomControl}, ResourceId=StringResourceName}"
Это нужно для того, чтобы не было совпадений с ключами из других сборок, поэтому обычный строковый идентификатор StringResourceName дополняется ссылкой на тип контрола {x:Type my:CustomControl} — это обеспечивает уникальность ключа для ресурса.
Стиль контрола оформляется так:
<Style x:Key="{x:Type my:CustomControl}" TargetType="{x:Type my:CustomControl}"/>
enum Bool { True, False, FileNotFound }