[英]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.