2016-09-07 3 views
0

Мне нравится разделять некоторые из моих пользовательских элементов управления на dll.Пользовательский стиль управления по умолчанию

позволяет предположить, у меня есть следующий пример управления:

MyControl.cs

namespace MyControlsNs { 
    public class MyControl : ContentControl { 
     public static DependencyProperty IsGreatProperty = 
      DependencyProperty.Register("IsGreat", 
            typeof (bool), 
            typeof (MyControl), 
            new PropertyMetadata(true)); 
     public bool IsGreat { 
      get { return (bool) GetValue(IsGreatProperty); } 
      set { SetValue(IsGreatProperty, value); } 
     } 
    } 
} 

MyControl.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:controls="clr-namespace:MyControlsNs"> 
    <Style x:Key="MyControl" TargetType="controls:MyControl"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <CheckBox IsChecked="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsGreat}" /> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</ResourceDictionary> 

Если я хотел бы использовать MyControl я на самом деле сделать следующее :

<UserControl x:Class="MyMainViewClass" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:controls="clr-namespace:MyControlsNs"> 
    <UserControl.Resources> 
     <ResourceDictionary Source="MyControl.xaml" /> 
    </UserControl.Resources> 
    <controls:MyControl IsGreat="true" Style="{StaticResource MyControl}" /> 
</UserControl> 

Моя цель - сохранить определение RD и стиля, когда я использую его в MyMainViewClass; например:

<UserControl x:Class="MyMainViewClass" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:controls="clr-namespace:MyControlsLib.MyControlsNs;assembly=MyControlsLib"> 
    <controls:MyControl IsGreat="true" /> 
</UserControl> 

Как определить мой стиль по умолчанию для MyControl? Я нашел эту нить Creating default style, но интеграция не работает для меня:

static MyControl() { 
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(typeof(MyControl))); 
} 

ответ

1

Стиль по умолчанию для пользовательского элемента управления в библиотеке находится в файле с именем Generic.xaml в папке с именем Themes в проекте библиотеки.

Обратите внимание также, что ресурс стиля по умолчанию не имеет набора атрибутов x:Key.

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:controls="clr-namespace:MyControlsNs"> 
    <Style TargetType="controls:MyControl"> 
     ... 
    </Style> 
</ResourceDictionary> 

Переопределение значение по умолчанию собственности на DefaultStyleKey зависимости от таможенного контроля гарантирует, что стиль по умолчанию фактически применяется к правильному типу управления:

static MyControl() 
{ 
    DefaultStyleKeyProperty.OverrideMetadata(
     typeof(MyControl), 
     new FrameworkPropertyMetadata(typeof(MyControl))); 
} 

Наконец, вы также должны установить атрибут ThemeInfo в вашей библиотеке AssemblyInfo.cs:

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

Пожалуйста, смотрите Control Authoring Overview статья о MSDN для дальнейшего чтения.

+0

Отличный ответ! Спасибо. Моя ошибка заключалась в определении моего RD в файле MyControl.xaml, кроме Themes/Generic.xaml. Теперь все в порядке. – WPFGermany

Смежные вопросы