簡體   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