Silverlight 3 - 在合并的ResourceDictionary中创建自定义对象
我有自定义的类,我当前在App.xaml中实例化为资源。我想将这些自定义对象移动到合并ResourceDictionary中,在样式中使用它们,并使它们保持靠近它们的使用位置。 这里有我想要的东西,随意使用伪造的转换器对象的例子,但它们可以是任何自定义对象...Silverlight 3 - 在合并的ResourceDictionary中创建自定义对象
的App.xaml(命名空间声明ommitted):
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Merged.xaml" />
</ResourceDictionary.MergedDictionaries>
<Style x:Key="SomeStyle" TargetType="SomeControl">
...
</Style>
...
</ResourceDictionary>
而且然后在Merged.xaml(命名空间声明省略):
<ResourceDictionary>
<cvt:VisibilityToBoolConverter x:Key="BoolToVisibility" Inverted="True"/>
<cvt:VisibilityToBoolConverter x:Key="NotBoolToVisibility" Inverted="True" Not="True"/>
<Style x:Key="SomethingThatUsesVisibilityToBoolConvertersStyle" TargetType="SomeOtherControl">
....
</Style>
</ResourceDictionary>
我看到的问题是这样的:当我创建了BoolToVisibility和Not BoolToVisibility对象(以及实例化作为我创建的自定义类的实例的其他对象)与Application.Resources一样,它们被创建并且所有引用都按预期工作;但是,当我将它们移动到合并资源字典中时(如上面示例中所示),Silverlight应用程序加载时会出现格式错误的应用程序异常。
我相信这是合并资源字典中实例化对象的一个问题(我相信它更像是一种惰性加载方法),但我希望它仍然有效。
我非常能够添加Style对象,DataTemplates,ControlTemplates等。但是当我想创建使用Xaml命名或键入的自定义类的实例时,它在App.xaml的Application.Resources中直接运行,而且在Application.Resources/ResourceDictionary中运行也很好。只要它们被移入合并的字典中,它就会抛出异常。这是设计吗?任何其他想法的工作?在此先感谢...
我已最终解决此问题。我从App页的实例化过程中抽出一页,并对Merged.xaml文件做了相同的处理。我为Merged.xaml创建了一个具有“代码隐藏”的类,名为Merged,它从ResourceDictionary继承。然后我(从App.g.cs借用),我通过在构建过程中从Merged.xaml文件加载来初始化组件。
Merged.xaml.cs:
public partial class Merged : ResourceDictionary
{
private bool _contentLoaded;
public Merged()
{
InitializeComponent();
}
public void InitializeComponent()
{
if (_contentLoaded)
{
return;
}
_contentLoaded = true;
System.Windows.Application.LoadComponent(this, new System.Uri("/MySilverlightApp;component/Merged.xaml", System.UriKind.Relative));
}
}
的Merged.xaml文件看起来完全一样,在我原来的问题,使用资源字典,因为它的根元素。
App.xaml略有不同。相反,通过使用资源字典元素和源属性引用合并的ResourceDictionary的,我只是引用的合并类:
<Application.Resources
xmlns:msa="clr-namespace:MySilverlightApplication">
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<msa:Merged />
</ResourceDictionary.MergedDictionaries>
<Style x:Key="SomeStyle" TargetType="SomeControl">
...
</Style>
...
</ResourceDictionary>
</Application.Resources>
中提琴!有用。
通过将共享xaml的构建操作设置为“Resource”并将其引用为/AssemblyName;component/Shared.xaml,可以避免额外的代码隐藏。由于大多数情况下逃脱我的原因,以这种方式引用它允许自定义对象实例化正常工作。