UWP中的模板控制与自定义控制.网上找不到明确的答案

LeB*_*nes 4 c# wpf xaml templates uwp

在我的UWP应用程序中,我的控制选项是用户控制和模板控制.我对用户控件的理解在这一点上很清楚.

有人告诉我,自定义控件的样式/模板只在内存中实例化一次,而这只发生在第一次使用控件时.这就是我想要的,因为我知道我正在创建的控件将在ListView中使用.

然而,在本书XAML Unleashed中,作者通过从用户控件开始创建自定义控件,然后简单地更改它的基类.问题在于他创建的控件InitializeComponent().我听说这种类使用更多内存,因为它为ListView中的每个项重新实例化.

此外,我从未想过自定义控件使用了该InitializeComponent()方法.我以为this.DefaultStyleKey = typeof(MyClass);在构造函数中只有一个调用.是什么赋予了?我很困惑什么是......

最后,为什么模板控件的样式/模板放在全局Generic.xaml文件中,而不是它自己的单独文件(即xaml文件和代码隐藏文件对)?如果控件应该是自定义的和"可移植的",那么它不应该与其他代码完全分开吗?我没有发现任何一篇文章在任何级别上都详细解释了这些内容.

Lai*_*ith 11

这是大多数人都错了,所以我会试着为你澄清一些事情.

记忆

整个记忆的东西,它都在视觉树中.当您实例化任何控件时,无论是模板还是UserControl,您都会在每个实例中使用内存,因为在这两种情况下,您都要在模板中创建可视组件的完整副本.

该模板控件将创建从一个副本ControlTemplate,而UserControl解析XAML文件时InitializeComponent()被调用.

如果您创建100个模板化控件或100个用户控件(如果它们的内容相同),则内存使用情况将相同.

用法

模板控件是最好的,你要创建一个单独的组件,如情况下Button,Slider,MyStarRatingInput等,你给你的控制的用户换出模板用自己的能力.要做到这一点需要花费很多精力,UserControls因为逻辑必须与模板无关,并且模板必须对视觉状态变化做出正确反应.

A UserControl最适合布局或视图,例如表单,弹出窗口,屏幕,页面等.您不会让某人自由篡改您的视图内容.如果某些视图可以以较小的方式重用,您可以公开一些公共/依赖属性,但通常它们是一成不变的.

Generic.xaml

老实说,我没有答案.Microsoft应该允许多个资源字典来实现控件模板的更清晰分区.Generic.xaml是一个保留的文件名,引用项目将查找作为控件基本样式的根源.您可以引用其他XAML文件Generic.xaml,但这很烦人,它会使资源字典的根目录膨胀.现在,你仍然坚持使用这种方法.

建议

如果您正在共享控件库,则可能希望尽可能使用模板化控件.如果您正在为当前项目构建控件,视图,页面等,并且它们不是为了重用,那么请使用UserControls.

UserControl如果您计划拥有模板并强制所有用户接受您的设计,您仍然可以在控件库中创建一个.

我还建议您计划在单个视图中实例化一百次的项目的模板化控件,例如ListView.如果将模板预先加载到内存中而不是在每个实例上解析XAML文件,您将看到明显的速度提升.