Wpf 资源样式打破了ResourceDictionary样式。如何让它们共存?

Wpf 资源样式打破了ResourceDictionary样式。如何让它们共存?,wpf,xaml,resources,resourcedictionary,Wpf,Xaml,Resources,Resourcedictionary,在WPF应用程序中,我有一个ResourceDictionary,其中为TargetTypeMyCustomControl定义了Style: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xml

在WPF应用程序中,我有一个
ResourceDictionary
,其中为TargetType
MyCustomControl
定义了
Style

<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" />
    ...
在本例中,虽然我在网格内的样式定义中只指定了一个属性,但根本不应用ResourceDictionary样式值。它们被页面资源样式覆盖并被忽略


如何解决这个问题?也许有一种方法可以在网格中引用ResourceDictionary.Resources部分来强制查找ResourceDictionary样式

不确定它是否是您想要的,但一种样式可以继承另一种样式。使用
BasedOn
-属性,可以定义
样式的基本样式,以便新样式继承此样式的所有设置

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

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


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

将新样式基于默认样式:

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

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

当应用程序查找 资源,它在 顺序如下:

1) 元素级别

系统从元素开始 引用资源,然后 搜索逻辑数据库的资源 父项等等,直到根 元素已到达

2) 应用程序级别

应用程序定义的资源 反对

3) 主题层面

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

在你的例子中,你有两种隐含的风格,所以HCL和Kent的答案应该有效。因为一次只能应用一个隐式样式。直接正确设置样式也是如此。在这种情况下,不会应用任何隐式样式


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

您在哪里定义/包括第一个ResourceDictionary?@code裸在App.xaml中作为一个
应用程序。Resources
ResourceDictionary.MergedDictionaries
中是的,这个想法是正确的,尽管在这种实现方式中它不起作用。尽管如此,感谢您第一个给出方向+1.
<Style TargetType="{x:Type ScNamespace:MyCustomControl}" BasedOn="{StaticResource {x:Type ScNamespace:MyCustomControl}}">
    <Setter Property="ContextMenu" Value="{StaticResource MyControlContextMenu}"/>
</Style>