ResourceDictionary.MergedDictionaries 的不同使用方式

Red*_*edX 7 c# xaml

我正在浏览我们产品中的一些代码,并看到一些同事以我以前从未见过的方式使用 ResourceDictionary.MergedDictionaries:

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <toolTips:ToolTips />
                <styles:ControlStyles />
                <icons:IconDictionary />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)

tooltips:ToolTips MergedDictionaries 中的所有其他元素都是 ResourceDictionaries。

根据互联网使用这些的常规方法是使用<ResourceDictionary Source="uri to your xaml file"/>.

那么两者之间有什么实际区别吗?

如果这种方式有效,为什么不更频繁地使用它,因为它可以很好地完成代码完成?

use*_*152 2

ResourceDicionary只在一个大项目中使用过这种方法一次,这对我的情况很有帮助。

假设您有ResourceDictionary文件MyDictionary.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                x:Class="YourNamespace.MyDictionary">    
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

您可以x:ClassResourceDictionary元素添加属性并指定代码隐藏类的完全限定名称。

让我们MyDictionary.xaml.cs用类创建MyDictionary(名称可以与xaml文件的名称不同)。

public partial class MyDictionary
{
    public MyDictionary()
    {
        InitializeComponent();
    }
}
Run Code Online (Sandbox Code Playgroud)

一个类必须是一个部分类。必须将构造函数添加到类中,并且InitializeComponent必须调用方法。如果您在中InitializeComponent设置属性,则会自动为该类生成该方法x:ClassMyDictionary.xaml

现在您可以MyDictionary参考MergedDictionaries

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <local:MyDictionary/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

如果你添加一些DataTemplateMyDictionary.xaml你可以在代码隐藏中创建事件处理程序(处理程序将由VS自动生成)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                x:Class="YourNamespace.MyDictionary">    
    <DataTemplate x:Key="MyTemplate">
        <Button Click="Button_Click"/>
    </DataTemplate>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

隐藏代码:

public partial class MyDictionary
{
    public MyDictionary()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        // custom logic
        // edit another element, etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

如果该类是从该类继承的ResourceDictionary,则可以从代码隐藏中访问其他资源。

定义的数据模板的使用示例MyDictonary

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <local:MyDictionary/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <ContentControl ContentTemplate="{StaticResource MyTemplate}"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

从我的角度来看,最大的优点是您可以将逻辑封装到单独的文件中(很容易在大型项目中维护和添加新功能)并避免ResourceDictionaries通过<ResourceDictionary Source="uri to your xaml file"/>.