我正在浏览我们产品中的一些代码,并看到一些同事以我以前从未见过的方式使用 ResourceDictionary.MergedDictionaries:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<toolTips:ToolTips />
<styles:ControlStyles />
<icons:IconDictionary />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
tooltips:ToolTips MergedDictionaries 中的所有其他元素都是 ResourceDictionaries。
根据互联网使用这些的常规方法是使用<ResourceDictionary Source="uri to your xaml file"/>.
那么两者之间有什么实际区别吗?
如果这种方式有效,为什么不更频繁地使用它,因为它可以很好地完成代码完成?
我ResourceDicionary只在一个大项目中使用过这种方法一次,这对我的情况很有帮助。
假设您有ResourceDictionary文件MyDictionary.xaml。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="YourNamespace.MyDictionary">
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
您可以x:Class向ResourceDictionary元素添加属性并指定代码隐藏类的完全限定名称。
让我们MyDictionary.xaml.cs用类创建MyDictionary(名称可以与xaml文件的名称不同)。
public partial class MyDictionary
{
public MyDictionary()
{
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
一个类必须是一个部分类。必须将构造函数添加到类中,并且InitializeComponent必须调用方法。如果您在中InitializeComponent设置属性,则会自动为该类生成该方法x:ClassMyDictionary.xaml
现在您可以MyDictionary参考MergedDictionaries
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<local:MyDictionary/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
如果你添加一些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>
Run Code Online (Sandbox Code Playgroud)
隐藏代码:
public partial class MyDictionary
{
public MyDictionary()
{
InitializeComponent();
}
private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
{
// custom logic
// edit another element, etc.
}
}
Run Code Online (Sandbox Code Playgroud)
如果该类是从该类继承的ResourceDictionary,则可以从代码隐藏中访问其他资源。
定义的数据模板的使用示例MyDictonary:
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<local:MyDictionary/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<ContentControl ContentTemplate="{StaticResource MyTemplate}"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
从我的角度来看,最大的优点是您可以将逻辑封装到单独的文件中(很容易在大型项目中维护和添加新功能)并避免ResourceDictionaries通过<ResourceDictionary Source="uri to your xaml file"/>.
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |