C# Wpf xamlreader使用自定义元素加载xaml

C# Wpf xamlreader使用自定义元素加载xaml,c#,wpf,xaml,xamlreader,C#,Wpf,Xaml,Xamlreader,我得到了一个自定义元素的画布,类似于texbox和形状 <Canvas Name="SomeCanvas" > <TextBox_Element Canvas.Left="400" Canvas.Top="200" Height="50" Name="s3" Background="#57FF3ACB" /> </Canvas> 稍后,我将尝试加载该文件并使用以下命令将ist转换回原始画布: FileStream fs = File.Open(

我得到了一个自定义元素的画布,类似于texbox和形状

<Canvas Name="SomeCanvas" >
    <TextBox_Element   Canvas.Left="400" Canvas.Top="200" Height="50" Name="s3" Background="#57FF3ACB"  />
</Canvas>
稍后,我将尝试加载该文件并使用以下命令将ist转换回原始画布:

FileStream fs = File.Open(openFileDialog.FileName, FileMode.Open, FileAccess.Read);
Canvas savedCanvas = XamlReader.Load(fs) as Canvas;
最后一个方法引发XamlParseException:

在类型“…TextBox\u元素”上找不到匹配的构造函数。您可以使用参数或FactoryMethod指令来构造此类型。”


有人知道如何从文件恢复画布吗?谢谢

您必须在
文本框\u元素
中定义一个无参数构造函数

XamlReader.Load默认情况下将始终查找空构造函数,而如果它具有必需的参数,则必须添加更多工作

它是XAML语言的一个“特性”,是声明性的,对构造函数一无所知。人们使用XAML来“翻译”和包装没有无参数构造函数的类的实例(它[对数据绑定也很有用][2])

在您的情况下,大致如下所示:

<ObjectDataProvider ObjectType="TextBox_Element">
    <ObjectDataProvider.ConstructorParameters>
        <x:Double>400</x:Double>
        <x:Double>200</x:Double>
    </ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>


var textBoxElem = (TextBox_Element) ((ObjectDataProvider)XamlReader.Parse(xamlStr)).Data;

在自定义类中是否有无参数构造函数?如果没有,请尝试以下操作:

public class TextBox_Element{

    public TextBox_Element(double x, double y){
        // code
    }
    public TextBox_Element(){
        // emptyness
    }
}

这对我有用,我希望它也能解决你的问题

它保存到的文件可能不包含自定义元素所需的信息?就像保存文本框一样,XamlReader需要有xmlns引用才能读取它

public class TextBox_Element
{
  public TextBox_Element(double left, double top)
  {
    // do whatever
  }
}
public class TextBox_Element{

    public TextBox_Element(double x, double y){
        // code
    }
    public TextBox_Element(){
        // emptyness
    }
}