1

我有当前在 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 应用程序加载时,我得到一个格式错误的应用程序异常。

我相信这是在合并资源字典中如何以不同方式实例化对象的问题(我相信这更像是一种延迟加载方法),但我仍然希望它能够工作。

我非常能够添加样式对象、DataTemplates、ControlTemplates 等。但是,当我想创建使用 Xaml 命名或键控的自定义类的实例时,它在 App.xaml 的 Application.Resources 和 Application.Resources/ResourceDictionary 中都非常有效。一旦它们被移动到一个合并的字典中,它就会抛出异常。这是设计使然吗?还有其他可行的想法吗?提前致谢...

4

2 回答 2

0

我终于解决了这个问题。我从 App 类如何被实例化中取出一页,并对 Merged.xaml 文件做了同样的事情。我为 Merged.xaml 创建了一个带有“代码隐藏”的类,称为 Merged,它继承自 ResourceDictionary。然后(借用 App.g.cs),我通过在构造期间从 Merged.xaml 文件加载来初始化组件。

合并的.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>

中提琴!有用。

于 2009-06-30T18:43:36.800 回答
0

您可以通过将共享 xaml 的构建操作设置为“资源”并将其引用为 /AssemblyName;component/Shared.xaml 来避免额外的代码隐藏。出于一个让我无法理解的原因,以这种方式引用它可以让自定义对象实例化正常工作。

于 2010-05-07T03:04:29.070 回答