并非所有样式都会在我的WPF控件中被覆盖

并非所有样式都会在我的WPF控件中被覆盖,wpf,Wpf,我有一个将WPF UI用作类库的系统。我还使用不同的usercontrols来控制用户在ui生命周期中看到的内容。这些都是在代码中设置的。然后,我添加了一个主题系统,您可以在其中创建一个XAML ResourceDictionary文件,并使用它来更改UI的外观。要应用样式,每次我创建窗口或用户控件时,FrameworkElement都会执行以下代码: public void ApplyStyle(FrameworkElement element) { var targetDir = e

我有一个将WPF UI用作类库的系统。我还使用不同的usercontrols来控制用户在ui生命周期中看到的内容。这些都是在代码中设置的。然后,我添加了一个主题系统,您可以在其中创建一个XAML ResourceDictionary文件,并使用它来更改UI的外观。要应用样式,每次我创建窗口或用户控件时,FrameworkElement都会执行以下代码:

public void ApplyStyle(FrameworkElement element)
{
    var targetDir = element.Resources.MergedDictionaries.FirstOrDefault(d => d.Contains("SonaStyleDocument"));
    if (targetDir != null && loadedResource != null)
    {
        element.Resources.MergedDictionaries.Remove(targetDir);
        element.Resources.MergedDictionaries.Add(loadedResource);
    }
}   
在我看来,我确实通过xaml代码设置了一个标准样式的文档。我在代码中找到默认样式,将其删除并添加新样式。现在这就可以了,我可以在应用外部资源字典时看到变化。但是,由于某些原因,我的按钮对更改没有反应。它们保持相同的样式,即使它已被删除。这是我的一个按钮代码:

<Button Style="{StaticResource KeyboardToggleButton}" Command="{Binding KeyboardToggleCommand}">
    <Button.Content>...</Button.Content>
</Button>

...
它使用style KeyboardToggleButton,它在我的默认样式文档中具有以下样式:

<Style TargetType="Button" x:Key="SonaButton">
    ...
</Style>
<Style TargetType="Button" x:Key="SonaPrimaryButton" BasedOn="{StaticResource SonaButton}">
    <Setter Property="Template" Value="{StaticResource DxcPrimaryButtonTemplate}" />
    ...
</Style>
<Style TargetType="Button" x:Key="ManipulationButton" BasedOn="{StaticResource SonaPrimaryButton}">
    ...
</Style>
<Style TargetType="Button" BasedOn="{StaticResource ManipulationButton}" x:Key="KeyboardToggleButton"  />

...
...
...
但我将其替换为以下样式:


...
这到底是怎么回事?它们都有相同的KeyboardToggleButton键,尽管模板不同,我可以看到我的其他控件对它们得到的新样式反应良好。我甚至测试了只添加新样式,而保留旧样式,结果是一样的。这些按钮就是不能接受这种新样式

更新:

所以我在阅读各种关于样式的文章,看看是否能找到更多的信息,还有一些文章提到了动态资源。为了解决这个问题,我首先将其中一个按钮的默认样式改为非常基本:

<Style TargetType="ButtonBase" x:Key="KeyboardToggleButton" />

然后更改了样式我要覆盖默认样式,只需更改背景:

<Style TargetType="Button" x:Key="KeyboardToggleButton">
    <Setter Property="Background" Value="Yellow"/>
</Style>

使用此设置时,什么也没有发生,但当我将样式从StaticResource更改为DynamicResource时,它就工作了。然而,这提出了另一个问题。我尝试在其他一个按钮上测试此结果,所有子样式和控件模板都已激活,系统在添加样式的代码中出现异常:

System.InvalidOperationException:“触发器上的属性不能为null。”


我尝试使用的样式(而不是默认样式)有一个带有触发器的控件模板,用于处理悬停事件、单击事件等。我的理论是,我在StaticResource中也遇到了这个问题,但是错误是隐藏的,系统直接默认为旧样式。我对这一理论的看法是,在进入新样式之前,我会主动删除默认样式。不删除旧样式也无济于事

我发现了问题。例外情况确实是答案,但只有当我更改代码以单独应用每种样式时。我本应该更多地关注这个例外,但我有一个隧道式的视野。答案来自这里:


我第一次尝试更改为buttonbase,但触发器“IsDefaulted”不起作用。这将无法解析,并且属性将为null。更改回TargetType=“Button”有效。没有例外。然后,我还将所有样式引用更改为动态,现在所有按钮(我正在查看的一个按钮除外)都具有正确的样式。它应该是动态的,因为我在运行时对它进行了更改。

您是否尝试过为
TargetType=“ButtonBase”
定义样式,或者添加
BasedOn=“{StaticResource{x:Type Button}}”
?@PavelAnikhouski我尝试过您的建议,但没有结果。你确实让我思考并发现了一些新的信息。我在post.downvote中添加了这些发现作为更新?请解释一下,这样我才能提高
<Style TargetType="Button" x:Key="KeyboardToggleButton">
    <Setter Property="Background" Value="Yellow"/>
</Style>