【问题标题】:Wpf xamlreader load xaml with custom elementsWpf xamlreader 使用自定义元素加载 xaml
【发布时间】:2014-05-06 19:47:22
【问题描述】:

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

<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 指令来构造此类型。'

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

【问题讨论】:

    标签: c# wpf xaml xamlreader


    【解决方案1】:

    您必须在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
      }
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-23
          • 1970-01-01
          相关资源
          最近更新 更多