首先,如果你純粹想使用在不同的組件使用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,使用用戶控件虛擬化項目控制內部調用UserControl
內InitializeComponent()
每次創建新的數據模板的時候,所以人們傾向於使用自定義控件反而導致性能問題。
但是,這已不再是UWP的情況下,無論它是一個用戶控件,自定義控件,甚至只是一個Grid
,只要他們有完全相同的子元素,它們將被加載次數相同。這意味着UserControl中的InitializeComponent
只會被調用很少次,直到虛擬化的ListView
有足夠的數字才能在整個列表中循環使用。
但請記住,另一個控制包裝是一個附加層,它總是會吸取更多的內存。因此,除非您需要模板上的其他邏輯(例如具有依賴項屬性來顯示/隱藏內容),否則不必提取其內容以放入另一個或自定義控件。
我希望我的解釋有道理。
爲什麼不簡單地嘗試一下,看它是否會以任何方式影響應用程序的性能? – Clemens
對於dataTemplate的內容您需要代碼隱藏類還是自定義視圖模型?否則,我認爲沒有意義創建用戶控件。 –
@NahuelIanni我正在使用ViewModel並將grdiview的ItemSource綁定到ViewModel的ObservableCollection屬性。我將在多個頁面上使用相同的數據模板,這就是爲什麼我想將其提取到用戶控件中的原因。 – touseef