使用未编译的XAML动态生成WPF控件
2012-08-31 17:40
274 查看
我们所经常使用的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一下看看了…
完整代码如下了:
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
运行效果如下了:
当然了…真正使用的时候呢…应该是从外部获取到XAML的内容了…然后生成控件…也就是Load()方法所实现的了…
XAMLReader不但能生成Button,TextBox而且还可以生成窗体等其他元素控件了…但是必须加载元素控件所在的命名空间了,即:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation”,如果没有加载所对应的命名空间就会出现错误了…
上述只是很简单的使用了…更强大的功能请君自己开发了,这些动态生成的控件是没有任何时间关联的了,如果想要实现事件触发还需在程序中指定了…
但是,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一下看看了…
完整代码如下了:
Application app = new Application();
[code]Window win = new Window();
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>";
win.Content = XamlReader.Parse(xaml);
app.Run(win);
[/code]
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
运行效果如下了:
当然了…真正使用的时候呢…应该是从外部获取到XAML的内容了…然后生成控件…也就是Load()方法所实现的了…
XAMLReader不但能生成Button,TextBox而且还可以生成窗体等其他元素控件了…但是必须加载元素控件所在的命名空间了,即:xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation”,如果没有加载所对应的命名空间就会出现错误了…
上述只是很简单的使用了…更强大的功能请君自己开发了,这些动态生成的控件是没有任何时间关联的了,如果想要实现事件触发还需在程序中指定了…
相关文章推荐
- CSC动态编译,监测文件夹下改变(Windows服务形式),自动编译生成dll供web项目使用
- C#代码生成控件动态效果-XAML篇
- Asp.net中使用文本框的值动态生成控件的方法
- 动态生成树结构TreeView控件的使用(源码)
- WPF中动态加载XAML中的控件
- WPF中如何使用代码操作数据模板生成的控件
- 使用GridView做出列选择效果(获取动态生成的控件.鼠标点选GridView.Ajax控件)
- 数据层使用Server对象;动态生成控件多文件上传
- WPF 纯代码生成界面(不使用XAML)
- 使用CODEDOM动态实现代码的生成,编译
- WPF控件模版怎么在xaml中使用(带触发器)
- 使用CODEDOM动态实现代码的生成,编译
- WPF学习系列013: 2.8 编译:将 XAML 与过程式代码混合使用
- 使用Type.GetType 动态生成 TextBlock 等控件
- 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发
- c# winform动态生成窗体及控件,并使用控件事件
- WPF中动态生成控件 完整代码
- WPF中如何使用代码操作数据模板生成的控件
- asp.net MVC中使用自定义HtmlForm控件动态生成表单
- 使用CodeDOM实现代码生成及动态编译