2014-01-31 4 views
2

В WPF/C# Я хочу определить новый класс, наследующий от существующего элемента управления, но который использует стиль базового элемента управления. Например:Стиль унаследованного элемента управления, такого как базовый элемент управления

class MyComboBox : ComboBox 
{ 
    void MyExtraMethod(){...} 
} 

я динамически переключаться в стиле Luna, выполнив:

var uri = new Uri("/PresentationFramework.Luna;V3.0.0.0;31bf3856ad364e35;component\\themes/Luna.normalcolor.xaml", UriKind.Relative); 
var r = new ResourceDictionary(); 
r.Source = uri; 
this.Resources = r; 

В то время как это правильно стили все экземпляры ComboBox с темами Luna, контроль MyComboBox заканчивает с Классическим темой. Как мне сделать MyComboBox унаследовать его стиль от ComboBox?

Я пишу все свои WPF в коде без использования разметки XAML. Я подозреваю, что свойства Style и BasedOn актуальны, но мне не удалось точно выяснить, как именно.

ответ

2

Следующая, кажется, работает:

public class MyComboBox : ComboBox 
{ 
    SetResourceReference(Control.StyleProperty, typeof(ComboBox)); 
} 
1

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

  1. Override defaultStyleKey metadata в статическом конструкторе MyComboBox.
  2. Объявите шаблон по умолчанию вашего пользовательского элемента управления под Themes/Generic.xaml папку и убедитесь, что она основана на стиле ComboBox.
  3. Вам нужно добавить тему Luna в качестве ресурсного словаря под Themes/Generic.xaml объединенные словари.

Декларация:

public class MyComboBox : ComboBox 
{ 
    static MyComboBox() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyComboBox), 
          new FrameworkPropertyMetadata(typeof(MyComboBox))); 
    } 
} 

Темы/Generic.xaml:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:YourNamespace"> <-- Replace namespace here 
    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary 
    Source="/PresentationFramework.Luna;component/themes/Luna.NormalColor.xaml"/> 
    </ResourceDictionary.MergedDictionaries> 

    <Style TargetType="local:MyComboBox" 
      BasedOn="{StaticResource {x:Type ComboBox}}"/> 

</ResourceDictionary> 
Смежные вопросы