Создание стиля по умолчанию для настраиваемого элемента управления - PullRequest
3 голосов
/ 06 августа 2009

В настоящее время я создаю пользовательский элемент управления (на основе WPF DataGrid). То, что я хотел бы сделать, это установить стиль по умолчанию для сетки данных. В настоящее время я устанавливаю свойство Style, которое работает. Но моя проблема возникает, когда я создаю стиль для изменения FX. цвет фона в основных приложениях app.xaml. Тогда все мои стили «по умолчанию» будут потеряны, и DataGrid будет выглядеть стандартно только с установленным свойством background.

Я пытался использовать OverrideMetadata для каждого свойства сетки, к которому я хочу применить значение по умолчанию, но безуспешно. Я также попытался установить каждое свойство в конструкторе, но из-за приоритета свойств стили из основного приложения никогда не применяются.

Есть идеи?

Заранее спасибо

Ответы [ 2 ]

13 голосов
/ 06 августа 2009

Вы установили это в конструкторе static?

DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomType), new FrameworkPropertyMetadata(typeof(MyCustomType)));

Кроме того, ключ вашего стиля ресурса равен типу вашего пользовательского элемента управления?

У него не должно быть другого набора ключей, даже если для TargetType установлено значение.

Сборка также должна быть помечена следующим атрибутом:

[assembly: ThemeInfo(
    //where theme specific resource dictionaries are located
    //(used if a resource is not found in the page, 
    // or application resource dictionaries)
    ResourceDictionaryLocation.None, 

    //where the generic resource dictionary is located
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly 
)]
5 голосов
/ 06 августа 2009

Если вы создаете стиль без ключа словаря, он будет стилизовать все объекты указанного вами типа в области, в которую вы импортируете свой словарь стилей (если вы укажете его в Window.Resources, у него будет область действия для этого окна ... если вы укажете это в App.xaml ... вы получите изображение).

  <Style TargetType="{x:Type Button}">
    <Setter Property="FontFamily" Value="Times New Roman" />
    <Setter Property="FontSize" Value="30" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Background" Value="#FFCA5132" />
  </Style>

Это придаст им одинаковый стиль.

Это очень мощная функция. Он позволяет стилизовать любой объект, а не только элементы пользовательского интерфейса. Вы можете стилизовать, скажем, одну из ваших сущностей данных, например, объект «Person», и когда эти элементы используются визуально, например, привязка списка данных типа Person к ListView, все они будут стилизованы так, как вы указали, даже если они не изначально элементы пользовательского интерфейса. Вот как WPF может быть «безразличным» к своим элементам управления.

...