如何将WPF自定义控件的某些属性序列化为元素而不是属性

时间:2017-08-24 09:03:01

标签: c# xml wpf serialization

我正在使用面具设计师的VS2015和WPF,我的客户可以为应用设计面具。

他们可以将自定义控件(我定义的)添加到这些蒙版中,并在保存时将蒙版序列化为XML,以便在需要对蒙版进行调整时重新加载蒙版。

我的一个自定义控件继承了Label,我添加了一个名为“DisplayText”的属性。

通常,该属性与所有其他属性一样被序列化为XML属性。

但现在我遇到了问题,在我的客户数据中有一些像“Q {a}”这样的值,这意味着一个大的“Q”后跟一个下标的小“a”。

所以我想在重新加载掩码时使用子标记替换XML中的“{a}”,但这不适用于属性只是XML元素。

<sub>a</sub>

接下来,我尝试在我的自定义控件中重新定义属性DisplayText:

[XmlElement("DisplayText")]
public string DisplayText
{
    get { return (string)GetValue(DisplayTextProperty); }
    set { SetValue(DisplayTextProperty, value); }
}

但是当我使用这样的控件保存蒙版时,DisplayText没有被序列化为元素。

当我尝试操作XML并用元素替换属性时,我得到DisplayText未知的错误消息。

我该如何解决这个问题?

这是一个测试示例,XML应该是什么样的(如果我错了的话,请跟我说话):

<Grid Name=\"grdMaskDesigner\" Grid.Column=\"0\" Grid.Row=\"1\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:pccl=\"clr-namespace:P16CustomControlLibrary;assembly=P16CustomControlLibrary\">
  <ScrollViewer>
    <Canvas Name=\"maskDesignerPanel\" Height=\"3500\" AllowDrop=\"True\" Visibility=\"Visible\">
      <Canvas.Background>
        <ImageBrush ImageSource=\"pack://application:,,,/P16Admintool;component/pictures/CanvasBackground.png\" ViewportUnits=\"Absolute\" Viewport=\"0,0,10,10\" Stretch=\"None\" TileMode=\"Tile\" />
      </Canvas.Background>
      <pccl:CustomLabel Name=\"RTB_1\" Width=\"80\" Height=\"40\" ToolTip=\"RTB1\" Canvas.Left=\"80\" Canvas.Top=\"60\">
        <DisplayText>Q_{a} =</DisplayText>
        <pccl:CustomLabel.ContextMenu>
          <ContextMenu Placement=\"MousePoint\">
            <MenuItem Header=\"Edit\" />
            <MenuItem Header=\"Remove\" />
            <MenuItem Header=\"Copy\" />
          </ContextMenu>
        </pccl:CustomLabel.ContextMenu>
      </pccl:CustomLabel>
    </Canvas>
  </ScrollViewer>
</Grid>

这是我用来序列化放置控件的Grid面板的方法:

public string SerializeControlToXaml(FrameworkElement element)
{
    var elementToXaml = new StringBuilder();
    var settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = true;
    var serializationManager = new XamlDesignerSerializationManager(XmlWriter.Create(elementToXaml, settings));
    serializationManager.XamlWriterMode = XamlWriterMode.Expression;
    XamlWriter.Save(element, serializationManager);
    var xaml = elementToXaml.ToString();

    return xaml;
}

0 个答案:

没有答案