2014-10-20 25 views
0

下面的代碼將創建兩個按鈕,但風格將只應用於第二我知道我可以使用模板,而我想知道爲什麼這個設置不起作用?爲什麼內容設置器僅適用於最後一個控件?

<Window x:Class="WpfApplication9.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <Style TargetType="Button"> 
     <Setter Property="Content"> 
      <Setter.Value> 
       <Grid> 
        <TextBlock Text="help"></TextBlock> 
       </Grid> 
      </Setter.Value> 
     </Setter> 
    </Style> 

</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
     <RowDefinition></RowDefinition> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition></ColumnDefinition> 
     <ColumnDefinition></ColumnDefinition> 
     <ColumnDefinition></ColumnDefinition> 
    </Grid.ColumnDefinitions> 

    <Button Grid.Row="1" Grid.Column="0"></Button> 
    <Button Grid.Row="1" Grid.Column="1"></Button> 


</Grid> 

回答

4

因爲UI元素只能存在於可視化樹中的一個位置,所以您不能(或至少不應該)在Setter中使用UI元素。也就是說:一個UI元素可能只有一個父元素。嘗試將內容以一些非UI值,就像一個簡單的字符串,並讓WPF應用數據模板你:如果你想指定複雜的UI內容

<Setter Property="Content" Value="help" /> 

,設置ContentTemplate代替;這將允許您使用DataTemplate來構建一個通用的可視化樹。

但是請注意,在按鈕設置器上設置Content是不尋常的;內容通常是從按鈕到按鈕的變化,而樣式旨在設置應該在控件實例間通用的屬性值。

3

Style共享,所以存在的Grid只有一個實例,因爲Visual只能有一個父它會在你使用它的最後的地方可見。您可以爲Style

<Style ... x:Shared="False"> 

x:Shared Attribute

禁用共享設置爲false時,會修改WPF資源檢索行爲,以便爲歸因資源請求創建一個新實例,爲每個請求,而不是共享相同所有請求的實例。

+0

使用模板或將共享屬性設置爲false會更好嗎?或者這是否具有相同的性能影響? – Bob 2014-10-20 20:29:42

+1

這只是另一種做事的方式,但我個人可以選擇模板。如果你可以避免它,你不應該使用視覺樣式設置器 – dkozl 2014-10-20 20:43:22

+1

同意,如果你想堅持WPF的推薦做法,使用模板。在將近十年的WPF開發中,我從未發現有必要使用'x:Shared',並且這條路線基本上是一種處理規則和最佳實踐的方式。這就是說,這是一個有用的事情要知道。 – 2014-10-20 21:00:18

相關問題