[英]Using ResourceDictionary.MergedDictionaries in App.xaml
[英]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.