WPF: применение пользовательской темы (обложки) к пользовательскому элементу управления - PullRequest
2 голосов
/ 06 мая 2011

У меня есть приложение, настроенное так, что я могу настроить его скин во время выполнения.Каждый раз, когда я меняю скин, я делаю это следующим образом:

Uri uri = new Uri("SomeThemeAssembly;component/Themes/StandardTheme.xaml", UriKind.Relative)
Application.Current.Resources.MergedDictionaries.Clear();
ResourceDictionary resource = (ResourceDictionary)Application.LoadComponent(uri);
Application.Current.Resources.MergedDictionaries.Add(resource);

Это прекрасно работает.

Я также создал собственный элемент управления с его шаблоном control, определенным в Themes / Generic.xaml, используяComponentResourceKeys для соответствующих ресурсов и т. Д.

x:Key="{ComponentResourceKey 
TypeInTargetAssembly={x:Type local:MyCustomControl}, 
ResourceId=MyBrush}"

Стиль самого пользовательского элемента управления не использует ключ componentresource, поскольку я хочу, чтобы он стилизовал все экземпляры.

<Style TargetType="{x:Type local:MyCustomControl}">

Опять же, все это работает нормальнои стандартные элементы управления, которые я использовал для создания элементов моего пользовательского элемента управления, соответствующим образом оформляются при смене обложки.

Однако в моем элементе управления есть ряд пользовательских свойств (кисти, ширины и т. д.), которые необходимостиль, чтобы соответствовать скинам, которые я применяю.

В примерах, которые я видел, используя стандартные темы Windows, добавляю дополнительный файл

Luna.StandardColor.Xaml

, например, в каталог тем пользователяЭлемент управления позволяет установить и выбрать измененный шаблон элемента управления при применении этой конкретной темы.В любом случае, насколько я могу судить, это не сработает, поскольку мои скины не являются темами.

Может ли быть достигнуто нечто подобное при использовании скинов таким же образом, как у меня?

Очевидно, что я могу добавить Styles и ControlTemplates в свои сборки скинов, но это неправильно, особенно если для ресурсов скинов существует стандартное соглашение о присвоении имен.Поэтому для сохранения в Themes / StandardTheme.xaml в сборке моего пользовательского элемента управления потребуется только один более поддерживаемый стиль.

После попытки прочтения этой темы у меня сложилось впечатление, что я хочу сделатьЭто либо невозможно, либо потребует дополнительной работы на ногах.

Любые мысли приветствуются.

1 Ответ

1 голос
/ 07 мая 2011

В каталоге тем CustomControls добавьте файл MyNewTheme.xaml, который представляет собой словарь ресурсов с неявным стилем, установленным для вашего элемента управления.Затем объедините этот словарь ресурсов с другим.Например:

Uri uri = new Uri("SomeThemeAssembly;component/Themes/MyNewTheme.xaml", UriKind.Relative)
Uri controlsUri = new Uri("ControlAssembly;component/Themes/MyNewTheme.xaml", UriKind.Relative)
Application.Current.Resources.MergedDictionaries.Clear();
ResourceDictionary resource = (ResourceDictionary)Application.LoadComponent(uri);
Application.Current.Resources.MergedDictionaries.Add(resource);
ResourceDictionary resource = (ResourceDictionary)Application.LoadComponent(controlsUri);
Application.Current.Resources.MergedDictionaries.Add(resource);
...