在Silverlight中向资源字典添加Code Behind时出现xClassNotDerivedFromElement错误。

7 浏览
0 Comments

在Silverlight中向资源字典添加Code Behind时出现xClassNotDerivedFromElement错误。

我需要根据这个问题的描述,在资源字典中添加代码后台类(我知道这不是一个好的做法,但根据链接问题的评论,它应该能工作)。我使用x:Class属性引用代码:

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


    ...

代码:

using System.Windows;
namespace MyNamespace
{
    public partial class MyStandardResources : ResourceDictionary
    {
        public MyStandardResources()
        {
            InitializeComponent();
        }
        //...
    }
}

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

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

这些资源在App.xaml中通过ResourceDictionary.MergedDictionaries标签进行了包含。

0
0 Comments

问题出现的原因是:在Silverlight中,创建了代码后台(code-behind)的资源字典后,无法使用URI创建ResourceDictionary。

解决方法是:通过在代码中创建一个空的ResourceDictionary,并将其Source设置为xaml的URI。这样做的好处是,其他人仍然可以引用资源字典,以及按照预期的方式使用它。

以下是解决方法的代码示例:

var resourceDictionary = new ResourceDictionary();
resourceDictionary.Source = new Uri("/YourAssembly;component/YourResourceDictionary.xaml", UriKind.Relative);

注意:这里的"YourAssembly"是你的程序集名称,"YourResourceDictionary.xaml"是你的资源字典的xaml文件名。

0
0 Comments

在Silverlight中,当向资源字典中添加Code Behind时出现了xClassNotDerivedFromElement错误。这个问题的原因是在App.xaml中,x:Class属性是被合并字典限制使用的。解决方法是将你的类定义为App资源的Code Behind。

具体做法是将下面的代码添加到App.xaml中:

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

通过这样的修改,你可以成功地向资源字典中添加Code Behind,避免了xClassNotDerivedFromElement错误的出现。

感谢分享这个宝贵的见解!

0
0 Comments

问题原因:

当将ResourceDictionary用作合并字典的Source值时,会出现xClassNotDerivedFromElement错误。这是由于Source属性值被转换为引用XAML而不是类的方式。XAML解析器在纯加载操作中打开该XAML,没有任何预编译的好处,并且无法在那个时候解析x:Class。

解决方法:

要解决这个问题,可以尝试以下几种方法:

1. 将ResourceDictionary的XAML代码移动到一个单独的XAML文件中,并在需要使用该ResourceDictionary的地方使用MergedDictionaries引用该文件。

2. 将ResourceDictionary的XAML代码移动到一个UserControl或Page中,然后在需要使用该ResourceDictionary的地方使用MergedDictionaries引用该UserControl或Page。

3. 将ResourceDictionary的XAML代码移动到一个类库项目中,并将该类库项目作为引用添加到需要使用该ResourceDictionary的项目中。

无论哪种方法,都需要确保在使用ResourceDictionary时,将其作为MergedDictionaries的一部分引用,而不是直接将其作为Source值。这样可以避免xClassNotDerivedFromElement错误的出现。

以下是一个示例,展示了如何将ResourceDictionary的XAML代码移动到一个单独的XAML文件,并在使用它的地方使用MergedDictionaries引用该文件:

在ResourceDictionary.xaml文件中的代码:


    

在使用ResourceDictionary的地方的XAML代码中的代码:


    
        
            
        
    

通过将ResourceDictionary的XAML代码移动到一个单独的XAML文件,并使用MergedDictionaries引用该文件,可以避免xClassNotDerivedFromElement错误的出现。

0