2016-02-04 41 views
1

給定一個風格在Page.Resource:UWP爲什麼樣式不適用於DataTemplate中的TargetTypes?

<Style x:Name="ItemTitle" TargetType="TextBlock"> 
     <Setter Property="FontSize" Value="16"></Setter> 
     <Setter Property="FontWeight" Value="Bold"></Setter> 
    </Style> 

它正確地應用到任何正規的TextBlock在同一頁上。

但是,當我在該頁面的GridView中爲某個項目使用DataTemplate時,此樣式不適用。

<DataTemplate x:Key="Output" x:DataType="vm:Output"> 
     <TextBlock Text="{x:Bind Text}"></TextBlock> 
    </DataTemplate> 

它的工作時,我明確地應用該樣式的DataTemplate中,例如:

<DataTemplate x:Key="Output" x:DataType="vm:Output"> 
     <TextBlock Style="{StaticResource ItemTitle}" Text="{x:Bind Text}"></TextBlock> 
    </DataTemplate> 

有誰知道這是怎麼回事?

回答

2

它是預期的和故意的。如果它不是從Control(如DataTemplate)派生的,那麼它將不會繼承隱式樣式,除非它們在應用程序資源字典中作爲全局默認值。

或更具體地說;

當爲不是Control的子類型的元素查找隱式樣式時,將模板視爲封裝邊界。

希望這會有所幫助。乾杯。

附錄:

如果它(的情況下,你有很多的嵌套在一個模板,你可以只設置一次,並允許它繼承到喜歡的類型的所有嵌套控件相同元素的僞);

<Parent> 
    <Parent.Resources> 
    <Style TargetType="TextBlock" BasedOn="{StaticResource ItemTitle}"/> 
    <Parent.Resources> 

    <!-- These will all inherit the Style resource now, 
     without explicit style setting individually. --> 
    <TextBlock/> 
    <TextBlock/> 
    <TextBlock/> 

</Parent> 
+0

我曾嘗試包裹模板的內容在,但這並沒有幫助(不知道是否會有,真的)。這是一個恥辱,因爲它意味着很多額外的明確的樣式分配,否則這是不必要的。 – Arwin

+0

我目前有8個(非常相似)DataTemplates與StackPanel,TextBlock和一個自定義控件在那裏(現在...),我正在尋找一種方法來避免必須在所有這些控件上指定樣式。我喜歡WPF中的這種方法,用於自動爲單個集合中的不同數據類型選擇不同的數據類型(例如,從相同基類繼承的搜索結果),最近甚至通過用EditViewModel類替換項來濫用它。當我認爲它是正確的時,肯定會標記你的答案! ;) – Arwin

+0

現在我已經決定採用不同的解決方案,爲所有重用的部件創建UserControls。無論如何,這更有意義。 – Arwin

相關問題