我浏览了我们产品中的一些代码,看到一些同事以一种我以前从未见过的方式使用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"/>。
那么两者之间有什么实际的区别吗?
如果这种方式有效,为什么不更多地使用它,因为它可以很好地完成代码?
发布于 2021-01-27 21:17:01
我只在一个大项目中使用过一次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>可以向ResourceDictionary元素添加x:Class属性,并指定代码隐藏类的完全限定名。
让我们使用类MyDictionary (名称可以与xaml文件的名称不同)创建MyDictionary.xaml.cs。
public partial class MyDictionary
{
public MyDictionary()
{
InitializeComponent();
}
}类必须是分部类。必须将构造函数添加到类中,并且必须调用InitializeComponent方法。如果在MyDictionary.xaml中设置了x:Class属性,则会为类自动生成InitializeComponent方法
现在,您可以在MergedDictionaries中引用MyDictionary
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<local:MyDictionary/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>如果您在MyDictionary.xaml中添加了一些DataTemplate,您可以在代码隐藏中创建事件处理程序(处理程序将由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.
}
}如果类是从ResourceDictionary类继承的,则可以从代码隐藏访问其他资源。
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。
https://stackoverflow.com/questions/65813501
复制相似问题