Как использовать стиль xaml в коде?

#c# #xml #wpf #xaml

#c# #xml #wpf ( ВП ) #xaml

Вопрос:

При разработке моего графического интерфейса я определил стиль для фигуры в файле 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}"/>
         </ControlTemplate>
     </s:DesignerItem.DragThumbTemplate>
</Rectangle>
  

При сохранении выходных данных в выходном XML-файле имеется свойство content этой формы. Теперь я хочу использовать эту же форму (точнее, ее содержимое) для создания XElement с тем же свойством содержимого. Для этого я попробовал этот:

 XElement myNewItem;
... ... //assign some other property values here
Object dataShape = Application.Current.Resources["Data_DragThumb"];
myNewItem.Content = dataShape;
  

Но это не дает мне точных значений содержимого формы, как показано в выходном XML-файле GUI, а вместо этого просто выдает строку что-то вроде «system.windows.style». На самом деле я надеялся увидеть ту же форму при визуализации ‘myNewItem’ здесь после указания значений содержимого. Как я могу это решить? Спасибо.

Обновить

Выходной XML-файл сохраняет форму в виде данных, подобных этому:

 <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=ADAX_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="DataShape" Tag="DataShapeTag"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;<Setter Property="FrameworkElement.Tag"amp;>amp;<Setter.Valueamp;>DataShapeamp;</Setter.Valueamp;>amp;</Setteramp;>amp;</Styleamp;>amp;</Rectangle.Styleamp;>amp;</Rectangleamp;>amp;</ControlTemplateamp;>amp;</dd:DesignerItem.DragThumbTemplateamp;>amp;</Rectangleamp;> </Content>
  

Я попытался получить это же значение содержимого и установить его как:

 myNewItem.Content = (the above shown content)
  

Но у меня это не работает. Что я хочу сделать, так это в своем коде настроить содержимое вручную, используя какой-либо метод, таким образом, чтобы код генерировал точно такую же форму, какую я рисую в графическом интерфейсе.

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

1. Вы ищете программу для чтения XAML. Однако неясно, почему вы хотите это сделать в первую очередь. Вы действительно должны хранить данные, а не пользовательский интерфейс. пользовательский интерфейс НЕ сериализуем, и вы не должны пытаться сериализовать его.

2. Я просто хочу сгенерировать ту же форму, что и в графическом интерфейсе, когда я читаю другой XML-файл. Не могли бы вы предоставить какой-либо пример кода или более подробный ответ на вашу точку зрения? Спасибо.

3. I just want to generate the same shape as in GUI when I read another xml file — Можете ли вы пояснить это подробнее? что находится в файле XML? вы пытаетесь сохранить пользовательский интерфейс в XML-файле? если да, то это неправильно. Вы должны использовать правильную привязку данных и хранить ДАННЫЕ в файле XML. Кроме этого, ваше требование не очень понятно для меня. Можете ли вы уточнить?

4. Я храню данные в выходном XML-файле. Существует тег элемента ‘Content’, который хранит данные формы в XML-файле. Я попытался даже скопировать и вставить это содержимое данных в ‘myNewItem. Контент», но это не работает. Надеюсь, я объяснил это ясно. У вас есть какие-нибудь предложения?

5. Я обновил свой вопрос.