2011-05-05 80 views
4

在一個WPF應用程序我有Style一個ResourceDictionary的TargetTypeMyCustomControl定義:WPF Grid.Resources樣式中斷ResourceDictionary樣式。如何讓它們共存?

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

    <Style TargetType="{x:Type cc:MyCustomControl}"> 
    <Setter Property="Prop1" Value="1" /> 
    <Setter Property="Prop2" Value="2" /> 
    ... 

的問題是,我需要在頁面XAML定義上下文菜單MyCustomControl像以下:

<Grid> 
    <Grid.Resources> 
      <ContextMenu x:Key="MyControlContextMenu"> 
       <MenuItem Name="Name1" 
         Header="Header1" 
         Click="Cm1_Click" 
         .../>     
       .... 
      </ContextMenu> 
     <Style TargetType="{x:Type ScNamespace:MyCustomControl}"> 
     <Setter Property="ContextMenu" Value="{StaticResource MyControlContextMenu}"/> 
     </Style> 
    </Grid.Resources> 
    ... 

在這種情況下,雖然我只在Grid中的Style定義中指定了一個Property,但ResourceDictionary Style的值完全不適用。它們會被頁面資源樣式覆蓋並被忽略。

如何解決這個問題?也許有一種方法可以在Grid.Resources部分中引用ResourceDictionary來強制查找ResourceDictionary樣式?

+0

你在哪裏定義/包含第一個ResourceDictionary? – CodeNaked 2011-05-05 17:34:09

+0

@CodeNaked在App.xaml中作爲'ResourceDictionary.MergedDictionaries'中的'Application.Resources' – rem 2011-05-05 17:49:21

回答

4

基礎上的默認樣式新樣式:

<Style TargetType="{x:Type ScNamespace:MyCustomControl}" BasedOn="{StaticResource {x:Type ScNamespace:MyCustomControl}}"> 
    <Setter Property="ContextMenu" Value="{StaticResource MyControlContextMenu}"/> 
</Style> 
+0

謝謝,肯特,它工作完美! +1 – rem 2011-05-05 17:44:20

1

不知道它是你在找什麼,但一個樣式可以從另一個繼承。使用BasedOn屬性,您可以定義Style的基本樣式,以便新樣式繼承此樣式的所有設置。

但是,我從來沒有嘗試過,如果它的作品,如果BasedOn引用相同的鍵(類型)。也許它的工作原理:

<Style TargetType="{x:Type ScNamespace:MyCustomControl}" 
     BasedOn="{x:Type ScNamespace:MyCustomControl}"> 

如果不工作,也許你可以分開Style,用鑰匙globaly定義它,然後通過BasedOn -property參考globaly定義的樣式。

+0

是的,這個想法是正確的,儘管在這種實現方式中它不起作用。儘管如此,感謝您首先給出方向。 +1 – rem 2011-05-05 17:47:10

1

一般來說,控件應該有一個主題特定的文件(見here獲取更多信息)在主題文件夾中定義的默認樣式。

當應用程序尋找一個 資源,它看起來在三個層次中 順序如下:

1)等級。

系統開始引用這些資源,然後 搜索邏輯 父的資源等等,直到到達根 元素的元素 。

2)應用程序級別。

由應用程序 對象定義的資源。

3)主題級別。

主題級詞典存儲在 名爲主題的子文件夾中。主題文件夾 中的文件對應 主題。例如,您可能有Aero.NormalColor.xaml, Luna.NormalColor.xaml, Royale.NormalColor.xaml等。 您也可以有一個名爲 generic.xaml的文件。當系統爲主題級別的資源查找 時, 首先在 主題特定文件中查找它,然後在generic.xaml中查找 。

你的情況,你有兩個隱含的樣式,所以HCL和肯特的答案應該工作。由於一次只能應用一個隱式樣式。直接正確設置樣式也一樣。在這種情況下,不會應用隱式樣式。

如果您將第一個樣式設置作爲主題級別的默認樣式,那麼除了第二個隱含樣式(或任何明確定義的樣式)之外,它將應用