Silverlight 3 - 在合并的ResourceDictionary中创建自定义对象

时间:2009-06-29 22:51:31

标签: silverlight-3.0

我有自定义类,我目前在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内部工作得很好。一旦它们被移动到合并的字典中,它就会抛出异常。这是设计的吗?还有其他有用的想法吗?提前谢谢......

2 个答案:

答案 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来避免额外的代码隐藏。由于一个主要逃避我的原因,以这种方式引用它允许自定义对象实例化正常工作。