xClassNotDerivedFromElement error when adding Code Behind to Resource Dictionary in silverlight

强颜欢笑 提交于 2019-12-05 21:34:43

问题


I need to add code behind class to Resource Dictionary as described in this question. (I know that this is not a good practise but it should work based on the comments for linked question) .I'm referencing the code with x:Class attribute:

XAML (separate Resource Dictionary file):

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

CODE:

using System.Windows;

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

        //...
    }
}

This causes the runtime parser exception:

Parser internal error: Object writer 'xClassNotDerivedFromElement'. [Line: xxx Position: xxx] at System.Windows.Application.LoadComponent.

The resources are included in App.xaml with ResourceDictionary.MergedDictionaries tag.


回答1:


Are you trying to use this ResourceDictionary as a Source value of a merged dictionary? If so, that is not supported. You get that xClassNotDerivedFromElement error, which is a weird way of indicating it, but here's why: the Source attribute value gets translated in a way that references the XAML as XAML, not as a class. The XAML parser opens that XAML as a pure load action without benefit of any precompile, and can't reconcile the x:Class at that time.




回答2:


The x:Class is restricted for merged dictionaries in App.xaml. Instead you should use your class defined as code behind in App resources:

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



回答3:


It is a pity that creating the code-behind for a resource dictionary now means you cannot create a ResourceDictionary using the URI to the xaml.

I removed my code-behind again, but still created the ResourceDictionary in code using the answer from this question+and+answer

Basically it just creates an empty ResourceDictionary and setting its Source to the xaml uri in code.

For me, this worked better because it means then that anyone else can still reference the resource dictionary if they wanted to, and do it the 'expected' way.



来源:https://stackoverflow.com/questions/3370661/xclassnotderivedfromelement-error-when-adding-code-behind-to-resource-dictionary

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!