2014-01-31 44 views
2

在WPF/C#中我想定義一個新的類繼承自現有的控件,但它使用基本控件的風格。例如:風格繼承控件像基本控件

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

我通過動態切換做月神風格:

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控制結束了與經典主題。我該如何讓MyComboBoxComboBox繼承它的風格?

我正在寫代碼中的所有WPF,而不使用XAML標記。我懷疑StyleBasedOn屬性是相關的,但我還沒有設法弄清楚如何。

回答

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>