繁体   English   中英

使用 ResourceDictionary.MergedDictionaries 的不同方式

[英]Different ways of using ResourceDictionary.MergedDictionaries

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

    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <toolTips:ToolTips />
                <styles:ControlStyles />
                <icons:IconDictionary />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>

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

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

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

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

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

假设您在MyDictionary.xaml文件中有ResourceDictionary

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                x:Class="YourNamespace.MyDictionary">    
</ResourceDictionary>

您可以将x:Class属性添加到ResourceDictionary元素并指定代码隐藏 class 的完全限定名称。

让我们使用 class MyDictionary MyDictionary.xaml.cs名称可以与 xaml 文件的名称不同)。

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

class 必须是部分 class。 必须将构造函数添加到 class 并且必须调用InitializeComponent方法。 如果在 MyDictionary.xaml 中设置x:Class属性, MyDictionary.xaml自动生成InitializeComponent方法

现在您可以在MergedDictionaries中引用MyDictionary

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <local:MyDictionary/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

如果您将一些DataTemplate添加到MyDictionary.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>

代码隐藏:

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

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

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

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

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <local:MyDictionary/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <ContentControl ContentTemplate="{StaticResource MyTemplate}"/>
</Grid>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM