#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» моего графического интерфейса или весь код целиком?