使用未编译的XAML动态生成WPF控件

我们所经常使用的WPF界面大部分都是使用XAML文件进行定义编写,然后经编译生成窗体和控件,还有的就是在后台代码中定义控件和元素…这些都是在程序编译后已经固化不变的了…如果想要在程序编译后再使用XAML生成控件就不是那么简单了…

但是,WPF还是狠狠强大的了…她不但可以在程序编译前根据XAML生成控件元素,而且还可以在程序编译后加载指定的XAML文件然后生成控件元素…好了废话不多说了>>>

<!----------华--------丽----------的-----------分----------割-------------线--------->

要想实现上述功能需要使用到System.Windows.Markup命名空间下的XamlRader类了…

下面是她的几个可以实现上述功能的方法了…
公共方法静态成员 Load(Stream)

    读取指定 Stream 中的 XAML 输入,并返回作为相应对象树根的 Object
公共方法静态成员 Load(XamlReader)

    通过所提供的 XamlReader 读取 XAML 输入,并返回作为相应对象树根的对象。

公共方法静态成员 Load(XmlReader)

    读取指定 XmlReader 中的 XAML 输入,并返回作为相应对象树根的对象。
公共方法静态成员 Load(Stream, ParserContext)

    读取指定 Stream 中的 XAML 输入,并返回作为相应对象树根的对象。

公共方法 LoadAsync(Stream)

    读取指定 Stream 中的 XAML 输入,并返回相应对象树的根。
公共方法 LoadAsync(XmlReader)

    读取指定 XmlReader 中的 XAML 输入,并返回相应对象树的根。

公共方法 LoadAsync(Stream, ParserContext)

    读取指定 Stream 中的 XAML 输入,并返回相应对象树的根。

公共方法静态成员 Parse(String)

    读取指定文本字符串中的 XAML 输入,并返回与指定标记的根对应的对象。

公共方法静态成员 Parse(String, ParserContext)

    (使用指定的 ParserContext)读取指定文本字符串中的 XAML 标记,并返回与指定标记的根对应的对象。

<!----------华--------丽----------的-----------分----------割-------------线--------->

首先呢,先尝试一下最简单的 Parse(String)方法了…

定义以下字符串了…

<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Width="200" Height="200" Background="Blue" >
    <Button Content="Dynamic Button One" Background="Yellow"/>
    <Button Content="Dynamic Button Two" Background="Yellow"/>
    <Button Content="Dynamic Button Three" Background="Yellow"/>
    <TextBox Text="Dynamic TextBox" Background="LightGreen"/>
</StackPanel>

然后呢,使用XamlReader.Parse(String)方法生成Object对象了,参数为上面的字符串值了…

然后声明一个窗体让窗体的Content对象等于上一步生成的Object对象了…然后让窗体Show一下看看了…

完整代码如下了:

   1:  Application app = new Application();
   2:  Window win = new Window();
   3:  String xaml = " <StackPanel xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" Width=\"200\" Height=\"200\" Background=\"Blue\" > <Button Content=\"Dynamic Button One\" Background=\"Yellow\"/> <Button Content=\"Dynamic Button Two\" Background=\"Yellow\"/> <Button Content=\"Dynamic Button Three\" Background=\"Yellow\"/> <TextBox Text=\"Dynamic TextBox\" Background=\"LightGreen\"/> </StackPanel>";
   4:  win.Content = XamlReader.Parse(xaml);
   5:  app.Run(win);

运行效果如下了:

捕获

当然了…真正使用的时候呢…应该是从外部获取到XAML的内容了…然后生成控件…也就是Load()方法所实现的了…

XAMLReader不但能生成Button,TextBox而且还可以生成窗体等其他元素控件了…但是必须加载元素控件所在的命名空间了,即:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation”,如果没有加载所对应的命名空间就会出现错误了…

上述只是很简单的使用了…更强大的功能请君自己开发了,这些动态生成的控件是没有任何时间关联的了,如果想要实现事件触发还需在程序中指定了…

posted @ 2012-08-31 17:40  Kord Kuo  阅读(912)  评论(0编辑  收藏  举报