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

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>

这会抛出一个StackOverFlowException,因为我的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 的唯一方法。不想将它们链接到每个控件中
    猜你喜欢
    • 1970-01-01
    • 2019-09-10
    • 2017-05-17
    • 1970-01-01
    • 2022-01-14
    • 2013-03-15
    • 2018-07-18
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多