【问题标题】:Using MergedDictionaries in generic.xaml in Silverlight 3在 Silverlight 3 的 generic.xaml 中使用 MergedDictionaries
【发布时间】:2010-10-15 21:35:32
【问题描述】:

在 WPF 中,可以通过将标记保存在主题文件夹中的单独 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 版 - 我不知道,但似乎我仍然在 Silverlight 2 运行时中运行,尽管显然安装了版本 3 运行时。

感谢 Jared 了解情况并与 SL3 团队核对...感谢 Amy DullardShawn Wildermuth 为在同一台机器上运行 Silverlight 2 和 3 生成说明和批处理文件。

【问题讨论】:

    标签: silverlight silverlight-3.0 mergeddictionaries generic.xaml


    【解决方案1】:

    我刚刚在用户控件中尝试了以下操作,并且成功了:

    <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。你遇到了什么问题?

    -- 编辑

    根据额外的cmets,我和SL3团队聊了聊,得到如下答案:

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

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

    在 generic.xaml 中,并将 generic.xaml 和 CustomControl.xaml 的构建操作修改为 Resource。如果还有问题,请告诉我——如果你有复制品,我可以看看。

    这有帮助吗?

    【讨论】:

    • 我的印象是 Silverlight 不支持 MergedDictionaries。这是 SL3 中的新功能吗?
    • 是的 - 我一般使用合并资源没有问题 - 但尝试为不同用户控件的样式/模板使用单独的 xaml 文件并将它们作为合并字典放在 generic.xaml 文件中是什么给我带来问题。
    • 嗯,这正是我正在做的。但这对我不起作用。该代码是 SL 2 项目与 generic.xaml 中现有控件的迁移。我将不得不对示例项目进行一些试验,看看我是否可以隔离问题,但至少我知道我走在正确的轨道上。谢谢。
    • 我有一个名为“X”的程序集和一个“Themes”文件夹,“Themes”包含 generic.xaml + a myControl.xaml。通用 xaml 与合并的字典位应该如何看待?我试着按照你上面写的,但我失败了
    • 注意:我刚刚发现在 WPF 4.5 中使用完整的资源语法也可以解决同样的问题
    【解决方案2】:

    如果 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 -->
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多