在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 回答
将您的新样式基于默认样式:
不确定它是否是您正在寻找的,但Style可以从另一个继承 . 使用
BasedOn
-property,您可以定义Style
的基本样式,以便新样式继承此样式的所有设置 .但是,如果
BasedOn
引用相同的键(类型),我也从未尝试过它 . 也许它有效:如果这不起作用,也许你可以分开
Style
,用一个键定义它全局,然后通过BasedOn
-property引用全局定义的样式 .通常,控件应在主题特定文件的Themes文件夹中定义其默认样式(有关详细信息,请参阅here) .
在您的情况下,您有两个隐式样式,因此HCL和Kent的答案应该有效 . 由于一次只能应用一个隐式样式 . 直接正确设置样式也是如此 . 在这种情况下,不会应用任何隐式样式 .
如果您将第一个样式设置作为主题级别的默认样式,那么它将应用 in addition to 您的第二个隐式样式(或任何明确定义的样式) .