首先,如果您纯粹想在不同的组件中使用与 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 中不再是这种情况,无论是 UserControl、Custom Control 还是只是 Grid,只要它们有完全相同的子元素,它们将被加载相同的次数。这意味着 UserControl 中的 InitializeComponent 只会被调用少量次,直到虚拟化的 ListView 有足够的数字来循环整个列表。
但请记住,另一个控件包装器是一个附加层,它总是会占用更多内存。因此,除非您希望在模板上添加其他逻辑,例如使用依赖属性来显示/隐藏内容,否则您不必提取其内容以放入另一个 UserControl 或 Custom Control.
我希望我的解释是有道理的。