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

标签 c# xaml user-controls uwp datatemplate

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

但请记住,另一个控件包装器是一个额外的层,它总是会占用更多的内存。因此,除非您希望在您的模板上添加额外的逻辑,例如具有显示/隐藏内容的依赖属性,否则您不必提取其内容以放入另一个 UserControlCustom Control.

我希望我的解释是有道理的。

关于c# - uwp 我应该在数据模板中使用用户控件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44677355/

相关文章:

c# - 对于 'char' 变量,“int”从不等于 null

C# - EventHandler 始终为空

c# - WinForm TabControl 选项卡页面内容在显示新选项卡之前不会更新

c# - 动态按钮命令事件不触发

c# - Autofac 约束绑定(bind)

c# - 如何在 asp.net 中使用 mvc2 验证隐藏任何页面元素

TreeView 和 Popup 控件的 WPF 问题

xaml - 在 Xbox UWP 中禁用 Web View 的指针模式

xaml - 是否可以在 XAML (Xamarin.Forms) 中混合 OnIdiom 和 OnPlatform?

C# 在不调用 ValueChanged 事件的情况下设置 UserControl.Value