我正在使用面具设计师的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;
}