WPF Grid.Resources样式打破ResourceDictionary样式。如何让它们共存?

时间:2011-05-05 17:19:28

标签: wpf xaml resources resourcedictionary

在WPF应用中,我为 TargetType ResourceDictionary定义了Style MyCustomControl

<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样式?

3 个答案:

答案 0 :(得分:4)

将新样式基于默认样式:

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

答案 1 :(得分:1)

不确定它是否是您正在寻找的,但Style可以从另一个继承。使用BasedOn - 属性,您可以定义Style的基本样式,以便新样式继承此样式的所有设置。

但是,如果BasedOn引用同一个键(类型),我也没试过。也许它有效:

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

如果这不起作用,也许您可​​以将Style分开,用键定义全局,然后通过BasedOn - 属性引用全局定义的样式。

答案 2 :(得分:1)

通常,控件应在主题特定文件的Themes文件夹中定义其默认样式(有关详细信息,请参阅here)。

  

当应用程序查找时   资源,它看起来在三个层面   以下顺序:

     

1)元素级别。

     

系统以元素开头   然后引用资源   搜索逻辑资源   父母等等直到根   到达了元素。

     

2)申请级别。

     

应用程序定义的资源   对象

     

3)主题级别。

     

主题级词典存储在   一个名为Themes的子文件夹。中的文件   Themes文件夹对应   主题。例如,你可能有   Aero.NormalColor.xaml,   Luna.NormalColor.xaml,   Royale.NormalColor.xaml,依此类推。   您还可以拥有一个名为的文件   generic.xaml。当系统看起来   对于主题级别的资源,它   首先在中寻找它   主题特定的文件然后查找   它在generic.xaml。

在您的情况下,您有两个隐式样式,因此HCL和Kent的答案应该有效。由于一次只能应用一个隐式样式。直接正确设置样式也是如此。在这种情况下,不会应用隐式样式。

如果您在主题级别将第一个样式设置作为默认样式,那么除了第二个隐式样式(或任何明确定义的样式)之外,它还将应用