Themable пользовательские элементы управления в WPF - PullRequest
8 голосов
/ 23 февраля 2009

Как я могу создать UserControl в WPF, который имеет базовый стиль по умолчанию, но также может легко тематически при необходимости?

У вас есть хорошие рекомендации, записи в блоге или пример, объясняющий эту конкретную тему?

Спасибо заранее, Marco

Ответы [ 2 ]

7 голосов
/ 23 февраля 2009

В темах WPF - это просто набор файлов XAML, каждый из которых содержит ResourceDictionary , который содержит определения Style и Template , которые применяются к элементам управления, используемым в приложение. Файл темы может выглядеть так:

<ResourceDictionary
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:uc="clr-namespace:MyApp.UserControls">

  <!-- Standard look for MyUserControl -->
  <Style x:Key="Standard" TargetType="{x:Type uc:MyUserControl}">
    <Setter Property="Width" Value="22" />
    <Setter Property="Height" Value="10" />
  </Style>

</ResourceDictionary>

Поддержка тем в приложении WPF должна быть явно включена путем добавления следующего атрибута в сборку:

[assembly: ThemeInfo(
  ResourceDictionary.None,
  ResourceDictionaryLocation.SourceAssembly
 )]

Это заставит WPF искать файл встроенного ресурса с именем themes \ generic.xaml , чтобы определить внешний вид элементов управления приложения по умолчанию.

Обратите внимание, что если тематические словари содержат отдельные файлы , то ресурсы сборки, стиля и шаблона приложения должны использовать составной ключ , который сообщает WPF, какая сборка содержит элемент управления что стиль / шаблон применяется к. Поэтому предыдущий пример должен быть изменен на:

<ResourceDictionary
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:uc="clr-namespace:MyApp.UserControls;assembly=MyApp">

  <!-- Standard look for MyUserControl in the MyApp assembly -->
  <Style x:Key="{ComponentResourceKey {x:Type uc:MyUserControl}, Standard}">
    <Setter Property="Width" Value="22" />
    <Setter Property="Height" Value="10" />
  </Style>

</ResourceDictionary>
1 голос
/ 23 февраля 2009

Посмотрите на эту статью: http://msdn.microsoft.com/en-us/magazine/cc135986.aspx

В нем рассказывается о том, как написать элемент управления, который можно изменить с помощью шаблона ControlTemplate, например встроенных элементов управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...