【问题标题】:uwp should I be using user control inside a data template?uwp 我应该在数据模板中使用用户控件吗?
【发布时间】:2017-06-21 13:20:25
【问题描述】:

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

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

【问题讨论】:

    标签: c# xaml user-controls uwp datatemplate


    【解决方案1】:

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

    您只需要创建一个名为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.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-20
      • 2021-09-08
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多