Wpf xamlreader加载带有自定义元素的xaml
本文关键字:元素 xaml 自定义 xamlreader 加载 Wpf | 更新日期: 2023-09-27 18:02:07
我得到了一个带有自定义元素的画布,类似于文本框和形状。
<Canvas Name="SomeCanvas" >
<TextBox_Element Canvas.Left="400" Canvas.Top="200" Height="50" Name="s3" Background="#57FF3ACB" />
</Canvas>
保存到文件中:
SerializeToXML(filename, SomeCanvas);
之后,我试图加载该文件并将列表转换回原始画布:
FileStream fs = File.Open(openFileDialog.FileName, FileMode.Open, FileAccess.Read);
Canvas savedCanvas = XamlReader.Load(fs) as Canvas;
最后一个方法抛出XamlParseException:
在类型'…TextBox_Element'上找不到匹配的构造函数。您可以使用Arguments或FactoryMethod指令来构造此类型。
有人知道如何从文件中恢复画布的方式吗?由于
您必须在TextBox_Element
中定义一个无参数构造函数。
XamlReader。Load默认情况下,总是查找空构造函数,而如果它有必需的参数,则必须添加更多的工作。
根据Max Galkin
这是XAML语言的一个"特性",它是声明性的,不知道任何关于构造函数的事情。人们在XAML中使用ObjectDataProvider来"翻译"和包装没有无参数构造函数的类的实例(它[对于数据绑定也很有用][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;
假设您的TextBox_Element
构造函数看起来像这样
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
}
}
这对我有用,我希望它也能解决你的问题!
也许它保存到的文件不包含定制元素所需的信息?就像保存一个文本框一样,XamlReader需要有xmlns引用才能读取它。