Как добавить пользовательский атрибут xml в элемент xml?

#c# #xml #wpf #xaml

#c# #xml #wpf #xaml

Вопрос:

При разработке графического интерфейса на C # в файле 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>
 

И этот графический интерфейс пока работает нормально, позволяя мне сохранять форму в 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>amp;<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"amp;>amp;<Rectangle.Styleamp;>amp;<Style TargetType="Rectangle"amp;>amp;<Style.BasedOnamp;>amp;<Style TargetType="Rectangle"amp;>amp;<Style.Resourcesamp;>amp;<ResourceDictionary /amp;>amp;</Style.Resourcesamp;>amp;<Setter Property="Shape.Fill"amp;>amp;<Setter.Valueamp;>amp;<LinearGradientBrush StartPoint="0,0" EndPoint="0,1"amp;>amp;<LinearGradientBrush.GradientStopsamp;>amp;<GradientStop Color="#FFFAFBE9" Offset="0" /amp;>amp;<GradientStop Color="#FFFFA500" Offset="1" /amp;>amp;</LinearGradientBrush.GradientStopsamp;>amp;</LinearGradientBrushamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="Shape.Stroke"amp;>amp;<Setter.Valueamp;>amp;<SolidColorBrushamp;>#FFD69436amp;</SolidColorBrushamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="Shape.StrokeThickness"amp;>amp;<Setter.Valueamp;>amp;<s:Doubleamp;>1amp;</s:Doubleamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="Shape.StrokeLineJoin"amp;>amp;<Setter.Valueamp;>amp;<x:Static Member="PenLineJoin.Round" /amp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="Shape.Stretch"amp;>amp;<Setter.Valueamp;>amp;<x:Static Member="Stretch.Fill" /amp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="UIElement.IsHitTestVisible"amp;>amp;<Setter.Valueamp;>amp;<s:Booleanamp;>Falseamp;</s:Booleanamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="UIElement.SnapsToDevicePixels"amp;>amp;<Setter.Valueamp;>amp;<s:Booleanamp;>Trueamp;</s:Booleanamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;</Styleamp;>amp;</Style.BasedOnamp;>amp;<Style.Resourcesamp;>amp;<ResourceDictionary /amp;>amp;</Style.Resourcesamp;>amp;</Styleamp;>amp;</Rectangle.Styleamp;>amp;<dd:DesignerItem.DragThumbTemplateamp;>amp;<ControlTemplateamp;>amp;<Rectangle Name="MyShape"amp;>amp;<Rectangle.Styleamp;>amp;<Style TargetType="Rectangle"amp;>amp;<Style.BasedOnamp;>amp;<Style TargetType="Rectangle"amp;>amp;<Style.BasedOnamp;>amp;<Style TargetType="Rectangle"amp;>amp;<Style.Resourcesamp;>amp;<ResourceDictionary /amp;>amp;</Style.Resourcesamp;>amp;<Setter Property="Shape.Fill"amp;>amp;<Setter.Valueamp;>amp;<LinearGradientBrush StartPoint="0,0" EndPoint="0,1"amp;>amp;<LinearGradientBrush.GradientStopsamp;>amp;<GradientStop Color="#FFFAFBE9" Offset="0" /amp;>amp;<GradientStop Color="#FFFFA500" Offset="1" /amp;>amp;</LinearGradientBrush.GradientStopsamp;>amp;</LinearGradientBrushamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="Shape.Stroke"amp;>amp;<Setter.Valueamp;>amp;<SolidColorBrushamp;>#FFD69436amp;</SolidColorBrushamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="Shape.StrokeThickness"amp;>amp;<Setter.Valueamp;>amp;<s:Doubleamp;>1amp;</s:Doubleamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="Shape.StrokeLineJoin"amp;>amp;<Setter.Valueamp;>amp;<x:Static Member="PenLineJoin.Round" /amp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="Shape.Stretch"amp;>amp;<Setter.Valueamp;>amp;<x:Static Member="Stretch.Fill" /amp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="UIElement.IsHitTestVisible"amp;>amp;<Setter.Valueamp;>amp;<s:Booleanamp;>Falseamp;</s:Booleanamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="UIElement.SnapsToDevicePixels"amp;>amp;<Setter.Valueamp;>amp;<s:Booleanamp;>Trueamp;</s:Booleanamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;</Styleamp;>amp;</Style.BasedOnamp;>amp;<Style.Resourcesamp;>amp;<ResourceDictionary /amp;>amp;</Style.Resourcesamp;>amp;</Styleamp;>amp;</Style.BasedOnamp;>amp;<Style.Resourcesamp;>amp;<ResourceDictionary /amp;>amp;</Style.Resourcesamp;>amp;<Setter Property="UIElement.IsHitTestVisible"amp;>amp;<Setter.Valueamp;>amp;<s:Booleanamp;>Trueamp;</s:Booleanamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="FrameworkElement.Height"amp;>amp;<Setter.Valueamp;>amp;<s:Doubleamp;>300amp;</s:Doubleamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;<Setter Property="FrameworkElement.Width"amp;>amp;<Setter.Valueamp;>amp;<s:Doubleamp;>200amp;</s:Doubleamp;>amp;</Setter.Valueamp;>amp;</Setteramp;>amp;</Styleamp;>amp;</Rectangle.Styleamp;>amp;</Rectangleamp;>amp;</ControlTemplateamp;>amp;</dd:DesignerItem.DragThumbTemplateamp;>amp;</Rectangleamp;></Content>
    </ConfigurationItem>
  </ConfigurationItems>
  <Connections />
</Root>
 

Теперь я хочу сделать две вещи:

Первая цель, я хочу добавить значение x:Name свойства как an 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()),
    ... ...
 

Но это дает совершенно пустое значение для атрибута ‘Name’ в выходном XML-файле, например:

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

Вторая цель, я хочу, чтобы пользователь мог изменять значение Name тега в моем графическом интерфейсе. Например, я хочу, чтобы по умолчанию Name тег был равен x:Name свойству формы, определенной в моем файле xaml. Но когда пользователь щелкает правой кнопкой мыши по фигуре и выбирает элемент, возможно, называемый «добавить новое имя», появляется текстовое поле, и пользователь вводит имя типа «Ракета», создает другую такую же фигуру на холсте и называет ее «Самолет», тогда я хочу, чтобы выходной файл xml выглядел следующим образомкак:

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

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

Может ли кто-нибудь помочь мне в решении этих двух проблем? Заранее большое спасибо.

Комментарии:

1. Я думаю, что он использует либо свойство Dependency, либо присоединенное свойство (попробуйте немного почитать в msdn). Кстати, я только посмотрел на ваш заголовок и только просмотрел сообщение.

2. Вы уверены, что item.Name.ToString() это не пустое?

3. Она пуста, вот в чем проблема.

4. не могли бы вы опубликовать рабочий образец, в котором есть проблема, могу я взглянуть. трудно определить реальную проблему.

5. Я не знаю, как опубликовать образец. Вы имеете в виду рабочий «exe» моего графического интерфейса или весь код целиком?