如何将自定义xml属性添加到xml元素?

时间:2014-06-26 13:46:53

标签: c# xml wpf xaml

在C#中设计GUI时,在xaml文件中,我创建了一个这样的形状:

<Style x:Key="Data" TargetType="Rectangle" BasedOn="{StaticResource FlowChartRectangleStyle}">
</Style>

<Style x:Key="Data_DragThumb" TargetType="Rectangle" BasedOn="{StaticResource Data}">
    <Setter Property="IsHitTestVisible" Value="true"/>
    <Setter Property="Height" Value="300"/>
    <Setter Property="Width" Value="200"/>
</Style>

<Rectangle Style="{StaticResource Data}" ToolTip="Data" StrokeThickness="2">
    <s:DesignerItem.DragThumbTemplate>
      <ControlTemplate>
        <Rectangle Style="{StaticResource Data_DragThumb}" x:Name="MyShape"/>
      </ControlTemplate>
    </s:DesignerItem.DragThumbTemplate>
 </Rectangle>

到目前为止,此GUI工作正常,使我能够将形状保存在xml文件中。为了将输出保存为xml,代码的序列化部分如下所示:

XElement serializedItems = new XElement("ConfigurationItems",
    from item in designerItems
    let contentXaml = XamlWriter.Save(((DesignerItem)item).Content)                                       
    select new XElement("ConfigurationItem",
        new XElement("X", Canvas.GetLeft(item)),
        new XElement("Y", Canvas.GetTop(item)),
        new XElement("Width", item.Width),
        new XElement("Height", item.Height),
        new XElement("ID", item.ID),
        new XElement("zIndex", Canvas.GetZIndex(item)),
        new XElement("ParentID", item.ParentID),
        new XElement("Content", contentXaml)
        )                                             
);

输出xml文件是:

<Root>
  <ConfigurationItems>
    <ConfigurationItem>
      <X>256</X>
      <Y>190.54</Y>
      <Width>130</Width>
      <Height>117</Height>
      <ID>fef14b95-4abb-44ea-a298-26d6e16a765e</ID>
      <zIndex>0</zIndex>
      <ParentID>00000000-0000-0000-0000-000000000000</ParentID>
      <Content>&lt;Rectangle StrokeThickness="2" ToolTip="Data" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:dd="clr-namespace:DiagramDesigner;assembly=GUI"&gt;&lt;Rectangle.Style&gt;&lt;Style TargetType="Rectangle"&gt;&lt;Style.BasedOn&gt;&lt;Style TargetType="Rectangle"&gt;&lt;Style.Resources&gt;&lt;ResourceDictionary /&gt;&lt;/Style.Resources&gt;&lt;Setter Property="Shape.Fill"&gt;&lt;Setter.Value&gt;&lt;LinearGradientBrush StartPoint="0,0" EndPoint="0,1"&gt;&lt;LinearGradientBrush.GradientStops&gt;&lt;GradientStop Color="#FFFAFBE9" Offset="0" /&gt;&lt;GradientStop Color="#FFFFA500" Offset="1" /&gt;&lt;/LinearGradientBrush.GradientStops&gt;&lt;/LinearGradientBrush&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="Shape.Stroke"&gt;&lt;Setter.Value&gt;&lt;SolidColorBrush&gt;#FFD69436&lt;/SolidColorBrush&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="Shape.StrokeThickness"&gt;&lt;Setter.Value&gt;&lt;s:Double&gt;1&lt;/s:Double&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="Shape.StrokeLineJoin"&gt;&lt;Setter.Value&gt;&lt;x:Static Member="PenLineJoin.Round" /&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="Shape.Stretch"&gt;&lt;Setter.Value&gt;&lt;x:Static Member="Stretch.Fill" /&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="UIElement.IsHitTestVisible"&gt;&lt;Setter.Value&gt;&lt;s:Boolean&gt;False&lt;/s:Boolean&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="UIElement.SnapsToDevicePixels"&gt;&lt;Setter.Value&gt;&lt;s:Boolean&gt;True&lt;/s:Boolean&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;/Style&gt;&lt;/Style.BasedOn&gt;&lt;Style.Resources&gt;&lt;ResourceDictionary /&gt;&lt;/Style.Resources&gt;&lt;/Style&gt;&lt;/Rectangle.Style&gt;&lt;dd:DesignerItem.DragThumbTemplate&gt;&lt;ControlTemplate&gt;&lt;Rectangle Name="MyShape"&gt;&lt;Rectangle.Style&gt;&lt;Style TargetType="Rectangle"&gt;&lt;Style.BasedOn&gt;&lt;Style TargetType="Rectangle"&gt;&lt;Style.BasedOn&gt;&lt;Style TargetType="Rectangle"&gt;&lt;Style.Resources&gt;&lt;ResourceDictionary /&gt;&lt;/Style.Resources&gt;&lt;Setter Property="Shape.Fill"&gt;&lt;Setter.Value&gt;&lt;LinearGradientBrush StartPoint="0,0" EndPoint="0,1"&gt;&lt;LinearGradientBrush.GradientStops&gt;&lt;GradientStop Color="#FFFAFBE9" Offset="0" /&gt;&lt;GradientStop Color="#FFFFA500" Offset="1" /&gt;&lt;/LinearGradientBrush.GradientStops&gt;&lt;/LinearGradientBrush&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="Shape.Stroke"&gt;&lt;Setter.Value&gt;&lt;SolidColorBrush&gt;#FFD69436&lt;/SolidColorBrush&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="Shape.StrokeThickness"&gt;&lt;Setter.Value&gt;&lt;s:Double&gt;1&lt;/s:Double&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="Shape.StrokeLineJoin"&gt;&lt;Setter.Value&gt;&lt;x:Static Member="PenLineJoin.Round" /&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="Shape.Stretch"&gt;&lt;Setter.Value&gt;&lt;x:Static Member="Stretch.Fill" /&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="UIElement.IsHitTestVisible"&gt;&lt;Setter.Value&gt;&lt;s:Boolean&gt;False&lt;/s:Boolean&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="UIElement.SnapsToDevicePixels"&gt;&lt;Setter.Value&gt;&lt;s:Boolean&gt;True&lt;/s:Boolean&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;/Style&gt;&lt;/Style.BasedOn&gt;&lt;Style.Resources&gt;&lt;ResourceDictionary /&gt;&lt;/Style.Resources&gt;&lt;/Style&gt;&lt;/Style.BasedOn&gt;&lt;Style.Resources&gt;&lt;ResourceDictionary /&gt;&lt;/Style.Resources&gt;&lt;Setter Property="UIElement.IsHitTestVisible"&gt;&lt;Setter.Value&gt;&lt;s:Boolean&gt;True&lt;/s:Boolean&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="FrameworkElement.Height"&gt;&lt;Setter.Value&gt;&lt;s:Double&gt;300&lt;/s:Double&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;Setter Property="FrameworkElement.Width"&gt;&lt;Setter.Value&gt;&lt;s:Double&gt;200&lt;/s:Double&gt;&lt;/Setter.Value&gt;&lt;/Setter&gt;&lt;/Style&gt;&lt;/Rectangle.Style&gt;&lt;/Rectangle&gt;&lt;/ControlTemplate&gt;&lt;/dd:DesignerItem.DragThumbTemplate&gt;&lt;/Rectangle&gt;</Content>
    </ConfigurationItem>
  </ConfigurationItems>
  <Connections />
</Root>

现在我想做两件事:

第一个目标,我想将x:Name属性值添加为XAttribute XElement,以便保存的xml文件看起来像这样:

<Root>
  <ConfigurationItems>
    <ConfigurationItem Name="MyShape">
      <X>256</X>
      <Y>190.54</Y>
... ... 

为此,我尝试在我的代码中添加以下行来序列化项目:

XElement serializedItems = new XElement("ConfigurationItems",
    from item in designerItems
    let contentXaml = XamlWriter.Save(((DesignerItem)item).Content)                                       
        select new XElement("ConfigurationItem",
        new XAttribute(" Name", item.Name.ToString()),
    ... ...

但是这为输出xml文件中的'Name'属性提供了一个完全空白的值,如下所示:

<Root>
  <ConfigurationItems>
    <ConfigurationItem Name="">
      <X>256</X>
      <Y>190.54</Y>
... ... 

第二个目标,我想让用户能够更改GUI中的Name标记值。例如,我想要的是,默认情况下,Name标记应该等于我的xaml文件中定义的形状的x:Name属性。但是当用户右键单击形状并选择一个项目(可能称为“添加新名称”)时,会出现一个文本框,用户输入“Rocket”这样的名称,在画布上创建另一个相同的形状并将其命名为“Aircraft” ,那么我希望xml输出文件看起来像:

<Root>
  <ConfigurationItems>
    <ConfigurationItem Name="Rocket">
      <X>256</X>
      <Y>190.54</Y>
... ... 
    </ConfigurationItem>

    <ConfigurationItem Name="Aircraft">
... ...

有人可以帮助我解决这两个问题吗?提前谢谢了。

0 个答案:

没有答案