2017-06-21 57 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。 –