首页 文章

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

提问于
浏览
4

在WPF应用程序中,我有一个 ResourceDictionary ,其中 Style 为TargetType 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 回答

  • 4

    将您的新样式基于默认样式:

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

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

    但是,如果 BasedOn 引用相同的键(类型),我也从未尝试过它 . 也许它有效:

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

    如果这不起作用,也许你可以分开 Style ,用一个键定义它全局,然后通过 BasedOn -property引用全局定义的样式 .

  • 1

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

    当应用程序查找资源时,它按以下顺序查看三个级别:1)元素级别 . 系统以引用资源的元素开始,然后搜索逻辑父资源的资源,依此类推,直到到达根元素 . 2)申请级别 . Application对象定义的资源 . 3)主题级别 . 主题级词典存储在名为Themes的子文件夹中 . Themes文件夹中的文件对应于主题 . 例如,您可能有Aero.NormalColor.xaml,Luna.NormalColor.xaml,Royale.NormalColor.xaml等 . 您还可以拥有一个名为generic.xaml的文件 . 当系统在主题级别查找资源时,它首先在特定于主题的文件中查找它,然后在generic.xaml中查找它 .

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

    如果您将第一个样式设置作为主题级别的默认样式,那么它将应用 in addition to 您的第二个隐式样式(或任何明确定义的样式) .

相关问题