在WPF开发中,我们经常定义资源的方式是通过在App.XAML文件的Resource节点、单独页面(Page、Window、UserControl等)的Resource下、元素节点下的Resource里以及单独添加资源字典(Dictionary.xaml)文件进行定义。其效果如下图所示。
这些定义,后台可以通过元素的FindResource方法检索Key找到定义的资源。
但是有些时候,我们资源没必要定义到XAML文件中,需要直接定义到CS文件中,通过后台代码直接获取。那么我们要如何定义其资源呢。
应用范围:在我们需要分离项目时,在某个DLL文件(自定义控件库)中,不方便使用APP文件中的资源。我们又很想通过后台来动态切换资源时。
下面我通过定义DataTemplate资源来实现。
原来XAML中定义格式:
<DataTemplate x:Key="NodeDataTemplate" >
<views:NodeDataView />
</DataTemplate>
<DataTemplate x:Key="EdgeDataTemplate">
<views:EdgeDataView />
</DataTemplate>
在CS文件定义:
public class TTResources
{
public static DataTemplate EdgeDataTemplate { get; } = new DataTemplate { VisualTree = new FrameworkElementFactory(typeof(Views.EdgeDataView)) };
public static DataTemplate NodeDataTemplate { get; } = new DataTemplate { VisualTree = new FrameworkElementFactory(typeof(Views.NodeDataView)) };
}
如此,我们可以在后台轻松的使用静态资源【TTResources.EdgeDataTemplate 】。也可以通过【x:Static】的形式在XAML文件中使用资源。