uwp 我应该在数据模板中使用用户控件吗?

uwp should I be using user control inside a data template?

在我的 UWP 应用程序中,我想将我的数据模板提取到单独的用户控件中,即:<DataTemplate><local:CustomTemplate/></DataTemplate> 并且用户控件 ( customtemplate ) 将具有之前直接在我的 DataTemplate 中的堆栈面板或网格,以及它的绑定,我已经知道如何实现这一点。

我的问题 是,通过在用户控件中提取数据模板,这会导致性能下降吗?我在某处读到,在执行此操作时,每个 GridViewItem 继续执行用户控件的 InitializeComponent() 并解析 xaml UI,这会导致性能问题?但是,如果我们将数据模板保存在同一个文件中(不在用户控件中提取),则不会出现性能问题。 这是真的吗?

首先,如果您纯粹想在不同的组件中使用使用 x:Bind 的相同 DataTemplate,则不必将所有元素包装在 UserControl 中 自定义控件.

您只需要创建一个名为 Templates.xaml 的资源字典,其中包含您要共享的所有数据模板(带有 x:Bind!),以及 cs class 同名这样 -

public partial class Templates  
{
    public Templates()
    {
        InitializeComponent();
    }
}

然后在你的Templates资源字典中,添加一个x:Class属性指向你刚刚创建的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 中的答案是

历史上在 WPF 中,每次创建新数据模板时,在虚拟化项控件中使用 UserControl 调用 UserControl 中的 InitializeComponent(),这会导致性能问题,因此人们倾向于使用 Custom Control

然而,在 UWP 中不再是这种情况,无论是 UserControlCustom Control 甚至只是 Grid,只要它们有完全相同的子元素,它们就会被加载相同的次数。这意味着 UserControl 内的 InitializeComponent 只会被调用少量次数,直到虚拟化的 ListView 有足够的数字来循环整个列表。

但请记住,另一个控件包装器是一个额外的层,它总是会占用更多的内存。所以除非你想在你的模板上添加额外的逻辑,比如对 show/hide 东西有依赖属性,你不必提取它的内容来放入另一个 UserControl自定义控件.

希望我的解释有道理。