首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ResourceDictionary.MergedDictionaries的不同方式

使用ResourceDictionary.MergedDictionaries的不同方式
EN

Stack Overflow用户
提问于 2021-01-21 00:24:32
回答 1查看 123关注 0票数 7

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

代码语言:javascript
复制
    <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"/>

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

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

EN

回答 1

Stack Overflow用户

发布于 2021-01-27 21:17:01

我只在一个大项目中使用过一次ResourceDicionary,这在我的情况下是有益的。

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

代码语言:javascript
复制
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                x:Class="YourNamespace.MyDictionary">    
</ResourceDictionary>

可以向ResourceDictionary元素添加x:Class属性,并指定代码隐藏类的完全限定名。

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

代码语言:javascript
复制
public partial class MyDictionary
{
    public MyDictionary()
    {
        InitializeComponent();
    }
}

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

现在,您可以在MergedDictionaries中引用MyDictionary

代码语言:javascript
复制
<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <local:MyDictionary/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

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

代码语言:javascript
复制
<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>

代码隐藏:

代码语言:javascript
复制
public partial class MyDictionary
{
    public MyDictionary()
    {
        InitializeComponent();
    }

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

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

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

代码语言:javascript
复制
<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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65813501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档