2017-06-21 55 views
2

在我的UWP应用程序中我正在考虑将我的数据模板提取到单独的用户控件中,即:<DataTemplate><local:CustomTemplate/></DataTemplate> 并且用户控件(customtemplate)将具有先前在我的DataTemplate中的那个堆栈面板或网格,以及其绑定,我已经知道如何做到这一点。uwp应该在数据模板中使用用户控件吗?

我的问题是通过提取用户控件中的数据模板,这会导致任何性能命中?我在某处读到这样的结果:GridViewItem继续执行执行用户控件的InitializeComponent(),并在UI上分析xaml,这会导致性能问题?但是,如果我们将数据模板保存在同一文件中(而不是在用户控件中提取),则不会发生性能问题。 这是真的吗?

+1

为什么不简单地尝试一下,看它是否会以任何方式影响应用程序的性能? – Clemens

+1

对于dataTemplate的内容您需要代码隐藏类还是自定义视图模型?否则,我认为没有意义创建用户控件。 –

+0

@NahuelIanni我正在使用ViewModel并将grdiview的ItemSource绑定到ViewModel的ObservableCollection属性。我将在多个页面上使用相同的数据模板,这就是为什么我想将其提取到用户控件中的原因。 – touseef

回答

4

首先,如果你纯粹想使用在不同的组件使用x:Bind相同DataTemplate,你不必包装所有的元素在任何一个用户控件自定义控件

你只需要创建一个名为Templates.xaml资源字典,其中包括所有的数据模板,你想分享,以及一个cs类具有相同的名称所示(x:Bind!) -

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

然后在你的Templates资源字典中,添加一个x:Class属性指向刚才创建的类 -

<ResourceDictionary x:Class="xxx.Templates" ..> 

最后,您将需要合并这一资源字典ionary到您的App.xaml或父资源字典 -

<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="Fonts.xaml" /> 
    <ResourceDictionary Source="Brushes.xaml" /> 
    <ResourceDictionary Source="Styles.xaml" /> 
    <local:Templates /> 
</ResourceDictionary.MergedDictionaries> 

现在构建并运行,它应该工作。关于这个话题,请参阅伊戈尔杰出的post,我几年前跟踪了这个话题,这对我来说完美无瑕。我甚至能够在那里创建代码隐藏的东西。


现在回到你的原始问题,将使用UserControl会损坏性能?

我个人认为在UWP中的答案是NO

历史上,WPF,使用用户控件虚拟化项目控制内部调用UserControlInitializeComponent()每次创建新的数据模板的时候,所以人们倾向于使用自定义控件反而导致性能问题。

但是,这已不再是UWP的情况下,无论它是一个用户控件自定义控件,甚至只是一个Grid,只要他们有完全相同的子元素,它们将被加载次数相同。这意味着UserControl中的InitializeComponent只会被调用很少次,直到虚拟化的ListView有足够的数字才能在整个列表中循环使用。

但请记住,另一个控制包装是一个附加层,它总是会吸取更多的内存。因此,除非您需要模板上的其他逻辑(例如具有依赖项属性来显示/隐藏内容),否则不必提取其内容以放入另一个或自定义控件

我希望我的解释有道理。

+0

无法将类型模板的值Avalue添加到IList类型的字典中。这是视觉工作室给我的错误。当我尝试将它合并到App.xaml中时,正如您提到的 – touseef

+0

也是我想在我的数据模板中使用2件事情。 1.视觉状态管理器。 2.处理后面代码中的事件(通过访问元素的Name属性 如果我在资源字典中使用数据模板,是否可以实现这2个?或者我应该使用数据模板的用户控件来实现这2个? – touseef

+0

试着详细地关注博客帖子,你一定错过了一些东西,数据模板可以给你no。2.如果你想在你的VSM中使用自适应触发器,你将不得不创建一个UserControl。 –