在我的UWP应用程序中,我的控制选项是用户控制和模板控制。我对用户控件的理解很明显。
我被告知自定义控件的样式/模板仅在内存中实例化一次,并且这仅在首次使用控件时发生。这就是我想要的,因为我知道我正在创建的控件将用于ListView。
然而,在本书XAML Unleashed中,作者通过从用户控件开始创建自定义控件,然后简单地更改它的基类。问题是他创建的控件调用了InitializeComponent()
。我听说这种类使用更多内存,因为它为ListView中的每个项重新实例化。
另外,我从未想过自定义控件使用了InitializeComponent()
方法。我以为在构造函数中只调用了this.DefaultStyleKey = typeof(MyClass);
。是什么赋予了?我很困惑什么是......
最后,为什么模板控件的样式/模板放在全局Generic.xaml文件中,而不是它自己的单独文件(即xaml文件和代码隐藏文件对)?如果控件应该是自定义的和“可移植的”,那么它不应该与其他代码完全分开吗?我没有发现任何一篇文章在任何级别都详细解释了这些内容。
答案 0 :(得分:7)
大多数人都错了,所以我会试着为你澄清一些事情。
<强>内存强>
整个记忆事物,它都在视觉树中。当您实例化任何控件时,无论是模板控件还是UserControl
,您都会在每个实例中使用内存,因为在这两种情况下,您都要在模板中创建可视组件的完整副本。
模板化控件将从ControlTemplate
创建副本,而UserControl
在调用InitializeComponent()
时解析XAML文件。
如果您创建100个模板化控件或100个用户控件(如果它们的内容相同),则内存使用情况将相同。
<强>用法强>
模板化控件最适合您创建单个组件的情况,例如Button
,Slider
,MyStarRatingInput
等等,并且您正在为控件的用户提供控件能够用自己的模板交换模板。要比UserControls
更好地完成这项工作需要花费很多精力,因为逻辑必须与模板无关,并且模板必须对视觉状态变化做出正确反应。
UserControl
最适合布局或视图,例如表单,弹出窗口,屏幕,页面等。您不会让某人自由篡改您的视图内容。如果某些视图可以以较小的方式重用,您可以公开一些公共/依赖属性,但通常它们是一成不变的。
<强> Generic.xaml 强>
老实说,我没有答案。 Microsoft应该允许多个资源字典来实现控件模板的更清晰分区。 Generic.xaml
是一个保留文件名,引用项目将查找作为控件基本样式的根源。您可以从Generic.xaml
引用其他XAML文件,但这很烦人,它会使资源字典的根目录膨胀。现在,你仍然坚持使用这种方法。
<强>建议强>
如果您正在共享控件库,则需要尽可能使用模板化控件。如果您正在为当前项目构建控件,视图,页面等,并且它们不是为了重用,那么请使用UserControls
。
如果您计划拥有模板并强制所有用户接受您的设计,您仍然可以在控件库中创建UserControl
。
我还建议您计划在单个视图中实例化一百次的项目的模板化控件,例如ListView
。如果将模板预先加载到内存中而不是在每个实例上解析XAML文件,您将看到明显的速度提升。