在Silverlight中向资源字典添加Code Behind时出现xClassNotDerivedFromElement错误。
在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标签进行了包含。
问题出现的原因是:在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文件名。
在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错误的出现。
感谢分享这个宝贵的见解!
问题原因:
当将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错误的出现。