在WPF中,如何得到任何Object对象的XAML代码?

转载 2012年03月21日 13:20:41
 

在WPF中,可以使用System.Windows.Markup.XamlWriter.Save(objName)得到任何Object对象的XAML代码。

这里举个例子,然后来比较一下:
XAML代码:
// Window1.xaml
<Window x:Class="XamlWriter.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="XamlWriter" Height="421" Width="485"
    >
    <Grid Name="Grid1">
    <Button Height="23" Margin="9,13,0,0" Name="buttonA" VerticalAlignment="Top" Click="WriteXaml_A" HorizontalAlignment="Left" Width="92">WriteMyXaml_1</Button>
    <Button Height="23" Margin="119,14,0,0" Name="buttonB" VerticalAlignment="Top"  Click="WriteXaml_B" HorizontalAlignment="Left" Width="96">WriteMyXaml_2</Button>
    <Button Height="24" Margin="228,15,141,0" VerticalAlignment="Top"  Name="buttonC" Click="WriteGridXaml">WriteGridXaml</Button>
    <Button Height="23" HorizontalAlignment="Right" Margin="0,15,11,0" VerticalAlignment="Top" Width="115" Click="WriteCSharpCode">WriteCodeButton</Button>
    <TextBox Margin="9,50,10,1" Name="textBox1" TextWrapping="Wrap"></TextBox>
  </Grid>
</Window>

C#代码:
// Window1.xaml.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace XamlWriter
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>

    public partial class Window1 : System.Windows.Window
    {

        public Window1()
        {
            InitializeComponent();
        }

        private void WriteXaml_A(object sender, RoutedEventArgs e)
        {
            string savedButton = System.Windows.Markup.XamlWriter.Save(this.buttonA);
            textBox1.Text = savedButton;
        }

        private void WriteXaml_B(object sender, RoutedEventArgs e)
        {
            string savedButton = System.Windows.Markup.XamlWriter.Save(this.buttonB);
            textBox1.Text = savedButton;
        }

        private void WriteGridXaml(object sender, RoutedEventArgs e)
        {
            string savedButton = System.Windows.Markup.XamlWriter.Save(this.Grid1);
            textBox1.Text = savedButton;
        }

        private void WriteCSharpCode(object sender, RoutedEventArgs e)
        {
            Button origianlButton = new Button();
            origianlButton.Height = 50;
            origianlButton.Width = 100;
            origianlButton.Background = Brushes.AliceBlue;
            origianlButton.Content = "Click Me";

            string savedButton = System.Windows.Markup.XamlWriter.Save(origianlButton);
            textBox1.Text = savedButton;
        }

    }
}

运行程序,当点击WriteGridXaml按钮后,我们可以看到如下结果:
XamlWriter

为了更清晰,我将上面结果都COPY成文字,为了方便阅读,我做了适当整理(加了换行):
<Grid Name="Grid1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Button Height="23" Margin="9,13,0,0" Width="92" HorizontalAlignment="Left" Name="buttonA" VerticalAlignment="Top">WriteMyXaml_1</Button>
<Button Height="23" Margin="119,14,0,0" Width="96" HorizontalAlignment="Left" Name="buttonB" VerticalAlignment="Top">WriteMyXaml_2</Button>
<Button Height="24" Margin="228,15,141,0" Name="buttonC" VerticalAlignment="Top">WriteGridXaml</Button>
<Button Height="23" Margin="0,15,11,0" Width="115" HorizontalAlignment="Right" VerticalAlignment="Top">WriteCodeButton</Button>

<TextBox TextWrapping="Wrap" Margin="9,50,10,1" Name="textBox1" AcceptsReturn="True">&lt;Button Height="23" Margin="119,14,0,0" Width="96" HorizontalAlignment="Left" Name="buttonB" VerticalAlignment="Top" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;WriteMyXaml_2&lt;/Button&gt;</TextBox>
</Grid>

我们来对比一下最原始的XAML代码与我们得到的XAML代码,为了简洁,只选第一个名为“buttonA”的按钮。

原始的XAML代码(从window1.xaml中节选):
<Button Height="23" Margin="9,13,0,0" Name="buttonA" VerticalAlignment="Top" Click="WriteXaml_A" HorizontalAlignment="Left" Width="92">WriteMyXaml_1</Button>

使用XamlWriter.Save()得到的XAML代码:
<Button Height="23" Margin="9,13,0,0" Width="92" HorizontalAlignment="Left" Name="buttonA" VerticalAlignment="Top">WriteMyXaml_1</Button>

请注意比较,有何不同?是不是Button的属性排列次序有变?而且,Click="WriteXaml_A" 这样的代码没有了?

其他的我也不多说了,想想看为什么?

运行WriteCSharpCode(object sender, RoutedEventArgs e)后会得到些什么呢?以下是结果:
<Button Height="50" Width="100" Background="#FFF0F8FF" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">Click Me</Button>

而其C#是:
Button origianlButton = new Button();
origianlButton.Height = 50;
origianlButton.Width = 100;
origianlButton.Background = Brushes.AliceBlue;
origianlButton.Content = "Click Me";

这就是C# 代码与XAML代码的相互转换了。提示:留意Background属性那句,将Brushes.AliceBlue转换成了“#FFF0F8FF”。

再想想看,这样的功能对我们有什么用途?多想多练,举一返三多得正果。

WPF对象的XAML序列化

WPF使用XAML来描述用户界面,每个XAML元素往往对应着相应的WPF对象,元素的属性对应着对象的属性。 由于XAML元素与WPF对象之前存在着这种对应关系,其实可以将XAML代码看成是WPF对象“...
  • new_smile
  • new_smile
  • 2016年06月08日 09:29
  • 996

WPF中Style文件的引用——使用xaml代码或者C#代码动态加载

WPF中控件拥有很多依赖属性(Dependency Property),我们可以通过编写自定义Style文件来控制控件的外观和行为,如同CSS代码一般。   总结一下WPF中Style样式的引用方法...
  • honantic
  • honantic
  • 2015年09月28日 11:45
  • 26680

C#进阶 WPF基础一 XAML控件基础、布局

XAML语言
  • tufeiax
  • tufeiax
  • 2015年05月31日 01:13
  • 1954

WPF -- 关于XAML语言解析处理及XAML引用

首先我们在Visual Studio中建立一个WPF项目,以下是新建的WPF程序的 xaml 文件...
  • qq_20804335
  • qq_20804335
  • 2015年09月11日 18:17
  • 1098

WPF入门——XAML和布局容器

它微软推出的基于Windows Vista的用户界面框架;它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作。WPF和.NET中winForm是类似的。...
  • suneqing
  • suneqing
  • 2014年10月23日 21:31
  • 4136

WPF教程(七)XAML中的事件

大多流行UI框架都是事件驱动的,WPF也是如此。所有的控件,包括继承了控件类的窗口,公开了一系列事件,你可以直接订阅,这意味着当事件发生时,它会告知应用程序并执行相应动作。事件有很多种类别,通过鼠标和...
  • seanbei
  • seanbei
  • 2016年09月22日 23:11
  • 2104

Xaml 中height和width中的Auto与*的区别

Auto 表示自动适应显示内容的宽度, 如自动适应文本的宽度,文本有多长,控件就显示多长. 星号 *  则表示按比例来分配宽度. Width="3*" /> Width="7*" /> ...
  • jacky_zh
  • jacky_zh
  • 2016年09月26日 14:32
  • 1743

WPF XAML X名称空间详解

X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML编译器将XAML代码编译为CLR代码。 【X名称空间里面到底都有些什么】     x名称空间...
  • aoshilang2249
  • aoshilang2249
  • 2015年03月18日 21:19
  • 1550

WPF数据绑定-用XAML绑定

用XAML绑定          WPF元素不仅是数据绑定的目标,它还可以是绑定的源。 可以把一个WPF元素的源属性绑定到另一个WPF元素的目标属性上。 ElementName指向绑定...
  • i1tws
  • i1tws
  • 2017年03月28日 21:42
  • 892

记录一下WPF开发(一)-- 基于xaml的界面UI主题

暑假实习的时候,做了一些工控项目,数据
  • scherrer
  • scherrer
  • 2014年09月29日 23:25
  • 3709
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在WPF中,如何得到任何Object对象的XAML代码?
举报原因:
原因补充:

(最多只允许输入30个字)