8

我需要按照这个问题中的描述将类后面的代码添加到资源字典中。(我知道这不是一个好习惯,但它应该根据链接问题的评论工作)。我正在引用带有 x:Class 属性的代码:

XAML(单独的资源字典文件):

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="MyNamespace.MyStandardResources">
    ...
</ResourceDictionary>

代码:

using System.Windows;

namespace MyNamespace
{
    public partial class MyStandardResources : ResourceDictionary
    {
        public MyStandardResources()
        {
            InitializeComponent();
        }

        //...
    }
}

这会导致运行时解析器异常:

解析器内部错误:对象编写器“ xClassNotDerivedFromElement ”。[行:xxx 位置:xxx] 在 System.Windows.Application.LoadComponent。

资源包含在带有 ResourceDictionary.MergedDictionaries 标记的 App.xaml 中。

4

3 回答 3

6

您是否尝试将此 ResourceDictionary 用作合并字典的 Source 值?如果是这样,则不支持。您会收到 xClassNotDerivedFromElement 错误,这是一种奇怪的指示方式,但原因如下:Source 属性值以将 XAML 引用为 XAML 而不是类的方式进行转换。XAML 解析器将 XAML 作为纯加载操作打开,没有任何预编译的好处,并且当时无法协调 x:Class。

于 2010-10-25T22:30:17.133 回答
5

x:Class 仅限于 App.xaml 中的合并字典。相反,您应该使用在 App 资源中定义为代码的类:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         x:Class="MyNamespace.App"
         xmlns:view="clr-namespace:MyNamespace">

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <view:MyStandardResources />
                ....
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>
于 2012-08-27T14:31:46.407 回答
0

遗憾的是,现在为资源字典创建代码隐藏意味着您无法使用 xaml 的 URI 创建 ResourceDictionary。

我再次删除了我的代码隐藏,但仍然使用这个问题+和+答案的答案在代码中创建了 ResourceDictionary

基本上它只是创建一个空ResourceDictionary并将其设置Source为代码中的 xaml uri。

对我来说,这效果更好,因为这意味着其他任何人仍然可以根据需要引用资源字典,并以“预期”的方式进行操作。

于 2012-11-22T09:41:27.373 回答