WPF中当资源之间相互依赖(xaml资源与类对象资源相互依赖)时,常见无法加载的问题

在WPF中,好多界面元素(UIElement,是不是所有的还不确定?)都有资源Resources属性。我们经常在窗体或Application对象中添加资源,常见的有xaml资源、Singleton对象(转换器、模板选择器、其它一些资源类等等,类本身不是Singleton的,但框架只加载一次并放到资源容器中供程序绑定使用,实质就是单个实例对象,此处用Singleton表述,不一定贴切),常见写法如下:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   ........./>

<Window.Resources>

<ResourceDictionary>

<ReourceDictionary.MergedDictionaries>

<ResourceDictionary Source="mypath\abc1.xaml"/>  //注:mypath是相对路径。如果在vs中创建了mypath文件夹,并将abc1.xaml放在mypath中,则必须写出其相对路径(文件夹名),否则加载时会找不到的,这与编写的c#类的加载机制是不同的,类文件无论是放在项目文件夹下的那个子文件夹中,都不需要管,IDE自己都能找到。

<ResourceDictionary Source="mypath\abc2.xaml"/>

</ResouceDictionary.MergedDictionaries>

<local:MyTemplateSelector x:Key="MyTemplateSelector"  TemplateProperty1={StaticResource TemplateProperty1}    TemplateProperty2={StaticResource TemplateProperty2} />

<local:MyTemplateSelector2 x:Key="MyTemplateSelector"  Template2Property1={StaticResource Template2Property1}    Template2Property2={StaticResource Template2Property2} />

</ResourceDictionary>

</Window.Resources>

.....

</Window>

在以上代码中,Window.Resources属性中放置了两个资源字典文件abc1.xaml,abc2.xaml,还有两个模板选择器,而模板选择器对象中需要注入两个属性TemplateProperty1和TemplateProperty2。通常情况下,模板选择器会依赖于资源字典文件(比如abc1.xaml,abc2.xaml)。wpf程序在加载的时候,会先加载xaml之类的资源字典文件,然后实例化Singleton对象,通常情况不会造成错误。

然而,如果xaml文件中还存在依赖TemplateSelector的情况(比如在xaml格式的数据模板中,还要应用模板选择器进一步进行模板选择的工作),此时在加载xaml字典文件时,由于TemplateSelector(以下记做TemplateDependedTemplateSelector)还没有实例化,这是在资源字典文件加载过程中就会遇到错误。一种可行的方式是:利用Application对象中的Resources属性,把TemplateDependedTemplateSelector及其依赖的xaml字典文件放到App.xaml中的    <Application.Resources>标签中,把依赖于TemplateDependedTemplateSelector的xaml字典文件放到Window.Resources中。这样,由于程序会现行加载app.xaml文件中写入的资源,所以TemplateDependedTemplateSelector及其依赖的xaml字典文件会现行加载,而依赖于TemplateDependedTemplateSelector的xaml文件会后加载,就可以解决问题。另外一种更直接的方法是:把TemplateDependedTemplateSelector及其依赖的xaml字典文件放到Window.Resources中,把依赖于TemplateDependedTemplateSelector的xaml字典文件及对应的Selector类对象直接放到需要用到的界面元素中,比如放到ContentControl.Resources中。



猜你喜欢

转载自blog.csdn.net/jiuzaizuotian2014/article/details/78883591