我有自定义类,我目前在App.xaml中实例化为资源。我想将这些自定义对象移动到Merged ResourceDictionary中,它们在样式中使用,并使它们靠近它们的使用位置。 这是我想要的一个例子,任意使用虚假的转换器对象,但它们可以是任何自定义对象......
App.xaml(省略名称空间声明):
<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和NotBoolToVisibility对象(以及实例化我创建的自定义类实例的其他对象)时,就像Application.Resources一样,它们被创建并且所有引用按预期工作;但是,当我将它们移动到合并资源字典中时(正如我在上面的示例中所示),当Silverlight应用程序加载时,我得到格式错误的应用程序异常。
我认为这是一个关于如何在Merged Resource Dictionaries中以不同方式实例化对象的问题(我相信它更像是一种延迟加载方法),但我希望它仍能正常工作。
我非常能够添加Style对象,DataTemplates,ControlTemplates等。但是当我想创建使用Xaml命名或键入的自定义类的实例时,它在App.xaml的Application.Resources和Application.Resources / ResourceDictionary内部工作得很好。一旦它们被移动到合并的字典中,它就会抛出异常。这是设计的吗?还有其他有用的想法吗?提前谢谢......
答案 0 :(得分:0)
我最终解决了这个问题。我从一个页面中了解了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文件看起来与原始问题完全相同,使用ResourceDictionary作为根元素。
App.xaml略有不同。我没有使用ResourceDictionary元素和Source属性引用Merged ResourceDictionary,而是简单地引用了Merged类:
<Application.Resources
xmlns:msa="clr-namespace:MySilverlightApplication">
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<msa:Merged />
</ResourceDictionary.MergedDictionaries>
<Style x:Key="SomeStyle" TargetType="SomeControl">
...
</Style>
...
</ResourceDictionary>
</Application.Resources>
中提琴!它有效。
答案 1 :(得分:0)
您可以通过将共享xaml的构建操作设置为“Resource”并将其引用为/AssemblyName ;component/Shared.xaml来避免额外的代码隐藏。由于一个主要逃避我的原因,以这种方式引用它允许自定义对象实例化正常工作。