1

我有一个带有自定义元素的画布,类似于 texboxes 和形状。

<Canvas Name="SomeCanvas" >
    <TextBox_Element   Canvas.Left="400" Canvas.Top="200" Height="50" Name="s3" Background="#57FF3ACB"  />
</Canvas>

我保存到一个文件中:

SerializeToXML(filename, SomeCanvas);

后来我试图加载该文件并将 ist 转换回原始画布:

FileStream fs = File.Open(openFileDialog.FileName, FileMode.Open, FileAccess.Read);
Canvas savedCanvas = XamlReader.Load(fs) as Canvas;

最后一个方法抛出 XamlParseException:

在类型“...TextBox_Element”上找不到匹配的构造函数。您可以使用 Arguments 或 FactoryMethod 指令来构造此类型。

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

4

3 回答 3

1

您必须在TextBox_Element.

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

根据马克斯·加尔金

它是 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
  }
}
于 2014-05-06T20:57:20.100 回答
0

您的自定义类中有无参数构造函数吗?如果没有,试试这个:

public class TextBox_Element{

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

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

于 2014-05-07T14:20:09.157 回答
0

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

于 2014-05-13T15:40:07.907 回答