在我的 UWP 应用程序中,我想将我的数据模板提取到单独的用户控件中,即:<DataTemplate><local:CustomTemplate/></DataTemplate>
并且用户控件 ( customtemplate ) 将具有之前直接在我的 DataTemplate 中的堆栈面板或网格,以及它的绑定(bind),我已经知道如何实现这一点。
我的问题 是,通过提取用户控件中的数据模板,这会导致性能下降吗?我在某处读到,在执行此操作时,每个 GridViewItem 都会执行用户控件的 InitializeComponent() 并在 UI 上解析 xaml,这会导致性能问题吗?但是,如果我们将数据模板保存在同一个文件中(不在用户控件中提取),则不会出现性能问题。 这是真的吗?
最佳答案
首先,如果您纯粹想在不同组件中使用使用 x:Bind
的相同 DataTemplate
,则不必将所有元素包装在用户控件 或自定义控件。
您只需要创建一个名为 Templates.xaml
的资源字典,其中包含您要共享的所有数据模板(使用 x:Bind
!),以及一个同名的 cs
类 -
public partial class Templates
{
public Templates()
{
InitializeComponent();
}
}
然后在您的Templates
资源字典中,添加一个x:Class
属性以指向您刚刚创建的类-
<ResourceDictionary x:Class="xxx.Templates" ..>
最后,您需要将此资源字典合并到您的 App.xaml
或父资源字典中 -
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Fonts.xaml" />
<ResourceDictionary Source="Brushes.xaml" />
<ResourceDictionary Source="Styles.xaml" />
<local:Templates />
</ResourceDictionary.MergedDictionaries>
现在构建并运行,它应该可以工作。请引用Igor的优秀post关于我几年前关注的这个主题,它对我来说非常有用。我什至还可以在其中创建代码隐藏内容。
现在回到您最初的问题,使用 UserControl
是否会影响性能?
我个人认为 UWP 中的答案是NO。
以前在 WPF 中,每次使用新数据模板时,在虚拟化项控件中使用 UserControl 都会调用 UserControl
中的 InitializeComponent()
已创建,这会导致性能问题,因此人们倾向于使用自定义控件。
但是,在 UWP 中不再是这种情况,无论是 UserControl、Custom Control 甚至只是一个 Grid
,只要它们具有完全相同的子元素,它们就会被加载相同的次数。这意味着 UserControl 内的 InitializeComponent
只会被调用少量次数,直到虚拟化的 ListView
有足够的数量来循环整个列表。
但请记住,另一个控件包装器是一个额外的层,它总是会占用更多的内存。因此,除非您希望在您的模板上添加额外的逻辑,例如具有显示/隐藏内容的依赖属性,否则您不必提取其内容以放入另一个 UserControl 或 Custom Control.
我希望我的解释是有道理的。
关于c# - uwp 我应该在数据模板中使用用户控件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44677355/