【问题标题】:Resources defined in UserControl.Resources can not see elements defined in MergedDictionaries set from codeUserControl.Resources 中定义的资源无法从代码中看到 MergedDictionaries 集中定义的元素
【发布时间】:2026-01-24 09:00:01
【问题描述】:

DefaultStyles 包含所有 DefaultStyleTextBoxes:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        Resources.MergedDictionaries.Add(new DefaultStyles());
        InitializeComponent();
    }
}

然后是Xaml,我继承了样式并添加了一点:

<UserControl.Resources>
    <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
        <Setter Property="Foreground" Value="Green "/>
    </Style>
</UserControl.Resources>

这会抛出一个*Exception,因为我的DefaultStyle 未找到,因此它会尝试自我引用。

为什么 Style 看不到合并字典中的默认样式?

【问题讨论】:

    标签: wpf xaml styles resourcedictionary


    【解决方案1】:

    它看不到它,因为它实际上是在替换它。 InitializeComponent 方法调用会将您在 ctor 中引用的字典替换为您在 XAML 中定义的字典。

    基本上,你做错了。为什么你不能这样做:

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="DefaultStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
    
            <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
                ...
            </Style>
        </ResourceDictionary>
    </UserControl.Resources>
    

    【讨论】:

    • 这就是我认为正在发生的事情,但事实并非如此。合并到代码中的字典可供控件的其余部分使用,并且可动态用于 UserControl 的资源,无论资源是否在 XAML 中定义。
    • 我们有一个复合应用程序,每个模块都有独立的样式。注入通用样式的自定义 UserControl 基类是我们能想到的获得与全局模块样式等效的 App.xaml 的唯一方法。不想将它们链接到每个控件中
    最近更新 更多