在Silverlight 3中的generic.xaml中使用MergedDictionaries

9
在WPF中,可以通过将多个用户控件的XAML标记保留在主题文件夹中的单独XAML文件中,并使用MergedDictionaries将它们导入到generic.xaml中来组织XAML。
<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="MyFirstControl.xaml" />
        <ResourceDictionary Source="MySecondControl.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

随着Silverlight 3 beta的推出,引入了合并字典的支持,似乎可以对Silverlight用户控件做相同的操作。但是,尝试了所有合并字典文件的构建操作组合以及在generic.xaml中源引用的相应语法,我似乎无法使其工作。

有其他人尝试过吗?有人知道是否可能以及我做错了什么吗?


好的- 经过多次测试项目,在WPF中获得工作样本,并将XAML和C#代码移植到Silverlight 3中,但仍然失败后,我进行了完全卸载和重新安装所有Silverlight 2位元和所有Silverlight 3 beta位元,最终使事情正常运转。

我只能假设我以某种方式得到了有缺陷的beta版本 - 我不知道,但似乎我仍在运行Silverlight 2运行时,尽管显然已安装了版本3运行时。

感谢Jared查看问题并与SL3团队核实...感谢Amy DullardShawn Wildermuth制作运行Silverlight 2&3的批处理文件的说明。

3个回答

12

我刚在一个用户控件中尝试了以下代码并且它成功运行:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ResourcesA.xaml" />
            <ResourceDictionary Source="ResourcesB.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>
<StackPanel>
    <Rectangle Width="100" Height="100" Fill="{StaticResource ResAColor}" />
    <Rectangle Width="100" Height="100" Fill="{StaticResource ResBColor}" />
</StackPanel>

但是你特别提到了generic.xaml。你遇到了什么问题?

-- 编辑

根据额外的评论,我与SL3团队进行了交流,并得到了以下答案:

我使用编译为资源的generic.xaml,并使用完整的资源语法,它对我起作用。在generic.xaml中无法使用相对URI作为源的存在一个错误(31783),但非相对形式应该可以正常工作。

<ResourceDictionary Source='/SilverlightClassLibrary1;component/CustomControl.xaml'/>

在generic.xaml中,修改generic.xaml和CustomControl.xaml的生成操作为Resource。如果仍有问题,请告诉我 - 如果您可以重现问题,我可以查看它。

这样可以帮助您吗?


我曾经认为在Silverlight中不支持MergedDictionaries。这是SL3中的新功能吗? - Rich
是的 - 通常合并资源使用没有问题 - 但是尝试使用不同用户控件的样式/模板的单独xaml文件,并将它们作为合并的字典放在一个generic.xaml文件中,这正是让我困扰的问题所在。 - Gordon Mackie JoanMiro
好的,这正是我正在做的事情。但是它对我来说并没有起作用。该代码是一个带有现有控件的SL 2项目的迁移,其中包含在generic.xaml中。我将不得不通过样本项目进行一些实验,以查看是否可以隔离问题,但至少我知道我正在正确的轨道上。谢谢。 - Gordon Mackie JoanMiro
我有一个名为“X”的程序集和其中的一个“Themes”文件夹,“Themes”包含generic.xaml + myControl.xaml。合并字典位应该如何在通用xaml中呈现?我尝试按照您上面写的方式进行,但我失败了。 - Maciek
注意:我刚发现在WPF 4.5中使用完整的资源语法也可以解决同样的问题。 - A.R.

1
如果 MySecondControl.xaml 使用了来自 MyFirstControl.xaml 的资源,则将它们添加到 generic.xaml 的 ResourceDictionary 中的顺序并不重要。您需要在 MySecondControl.xaml 中冗余地包含 MyFirstControl.xamlMySecondControl.xaml 应包含以下内容:
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source='/MyControls;component/Themes/MyFirstControl.xaml'/>
</ResourceDictionary.MergedDictionaries>
<!-- ... Contents of MySecondControl.xaml -->

0

我刚刚解决了这个问题。ResourceDictionaries支持MergedDictionaries,但对于使用Generic.xaml的自定义模板控件,Generic.xaml不支持MergedDictionaries。因此有两个选择:(1)将所有模板堆叠到Generic.xaml中;或者(2)创建YourOwnDictionary.xaml,将所有单独的字典合并到YourOwnDictionary.xaml中,并从用户控件和页面引用YourOwnDictionary.xaml。这似乎是早期Silverlight版本中不支持合并字典的功能/错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接