[UWP]如何使用代码创建DataTemplate(或者ControlTemplate)

1. 前言# 在UWP中DataTemplate是一个十分重要的功能,并且几乎无处不在,例如DataGrid中的DataGridTemplateColumn: Copy 而且DateTemplate(或ControlTemplate)极有可能需要由代码动态生成。 UWP大致上有两种使用代码生成DateTemplate的方式。 2. 使用资源字典# 这其实并不是由代码动态生成DataTemplate,只是比较方便的从资源字典读取DataTemplate的邪道,一般来说不好意思暴露给项目外的用户。 创建一个UserControl,然后把父类从“UserControl”改为“ResourceDictionary”,然后在Xaml中编写DataTemplate,为这个DataTemplate的x:Name赋值,并且将x:FieldModifier改为“internal”(这样DataTemplate才可以作为一个字段被项目中的其它类访问),代码如下: Copy public sealed partial class XamlResource : ResourceDictionary { public XamlResource() { this.InitializeComponent(); } } Copy 使用起来也很方便: Copy XamlResource resource = new XamlResource(); ListControl.ItemTemplate = resource.ItemTemplate; 这种做法的好处是编辑Datatemplate时有智能感知和属性面板,不容易出错;调用起来也很简单。虽然不够动态,但我常常使用这种方式创建DataTemplate。 3. 使用XamlReader# XamlReader用于解析XAML并创建相应的对象树。文档里给出的例子是构建一个Ellipse: Copy string xaml =""; object ellipse = XamlReader.Load(xaml); 当然了,要在代码里构建一个Ellipse何必这样大费周章。对于XamlReader,我平时用得最多的就是用来创建DataTemplate和ControlTemplate这些不方便用代码构建的元素。记得在XAML的根元素添加xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""和xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"": Copy var template = (DataTemplate)XamlReader.Load(@" "); ListControl.ItemTemplate = template; 这种方式满足了“动态”这个需求,缺点也很明显:动态的就容易出错,而且这种方式很难构建复杂的DataTemplate。 4. 结语# 这两种方式我都很常用,复杂的就用资源字典方式,简单但需要动态的就用XamlReader。有些人会为XamlReader做得更多,例如通过反射将一个TextBlock转换为XAML,再使用XamlReader读取成DataTemplate。我觉得这样也不错,但我还没遇到过这种应用场景就不尝试了。 5. 参考# DataTemplate XamlReader x:FieldModifier 作者:Dino.C 出处:https://www.cnblogs.com/dino623/p/Create-DataTemplate-Programatically.html 本站使用「署名 4.0 国际」创作共享协议,转载请在文章明显位置注明作者及出处。 分类: UWP 标签: UWP « 上一篇:[WPF]何如在Win7使用Aero2主题 posted @ 2019-01-15 08:30 dino.c 阅读(118) 评论(5) 编辑 收藏 https://www.cnblogs.com/dino623/p/Create-DataTemplate-Programatically.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信