2009-06-29 73 views
1

我有自定义的类,我当前在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中运行也很好。只要它们被移入合并的字典中,它就会抛出异常。这是设计吗?任何其他想法的工作?在此先感谢...

回答

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文件看起来完全一样,在我原来的问题,使用资源字典,因为它的根元素。
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> 

中提琴!有用。

0

通过将共享xaml的构建操作设置为“Resource”并将其引用为/AssemblyName;component/Shared.xaml,可以避免额外的代码隐藏。由于大多数情况下逃脱我的原因,以这种方式引用它允许自定义对象实例化正常工作。