天天看點

《Programming WPF》翻譯 第5章 4.元素類型樣式

命名樣式非常有用,當你得到一組屬性并應用到特點的元素上。然而,如果你想要應用一個統一的樣式到所有确定元素類型的執行個體,設定TargetType而不用一個Key,如示例5-16所示。

示例5-16

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

<!-- no Key -->

《Programming WPF》翻譯 第5章 4.元素類型樣式

<Style TargetType="{x:Type Button}">

《Programming WPF》翻譯 第5章 4.元素類型樣式

  <Setter Property="FontSize" Value="32" />

《Programming WPF》翻譯 第5章 4.元素類型樣式

  <Setter Property="FontWeight" Value="Bold" />

《Programming WPF》翻譯 第5章 4.元素類型樣式

</Style>

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

<Style TargetType="{x:Type TextBlock}">

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

  <Setter Property="FontWeight" Value="Thin" />

《Programming WPF》翻譯 第5章 4.元素類型樣式

  <Setter Property="Foreground" Value="White" />

《Programming WPF》翻譯 第5章 4.元素類型樣式

  <Setter Property="HorizontalAlignment" Value="Center" />

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

<Button Grid.Row="0" Grid.Column="0" x:ID="cell00" />

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

<TextBlock Grid.Row="5" Grid.ColumnSpan="5" x:ID="statusTextBlock" />

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

在示例

5-16所示,我們已經得到了兩種樣式,一種是帶有TargetType的Button,沒有key;另一種是帶有TargetType的TextBlock,沒有key。它們都以同樣的方式工作;當建立一個Button或TextBlock的執行個體而不用現實地設定Style屬性,它使用的樣式将目标類型比對到控件的類型。我們的元素類型樣式傳回了我們的遊戲如圖5-4所示。

元素類型樣式是便利的,無論何時你想要所有特定元素的執行個體共享一個外觀,依賴于範圍。例如,迄今,在頂級窗體中,我們已經在示例中為樣式設定了範圍,如示例5-17。

示例5-17

《Programming WPF》翻譯 第5章 4.元素類型樣式

<!-- Window1.xaml -->

《Programming WPF》翻譯 第5章 4.元素類型樣式

<Window 

《Programming WPF》翻譯 第5章 4.元素類型樣式

>

《Programming WPF》翻譯 第5章 4.元素類型樣式

  <!-- every Button or TextBlock in the Window is affected -->

《Programming WPF》翻譯 第5章 4.元素類型樣式

  <Window.Resources>

《Programming WPF》翻譯 第5章 4.元素類型樣式

    <Style TargetType="{x:Type Button}">

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

    <Style TargetType="{x:Type TextBlock}">

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

  </Window.Resources>

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

</Window>

盡管如此,我們可能想縮小元素類型樣式的範圍。在我們的示例中,這将工作良好将樣式限定範圍在

grid中,進而隻有grid中的Button和TextBlock受到影響,如示例5-18。

示例5-18

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

  <Grid 

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

    <!-- only Buttons or TextBlocks in the Grid are affected -->

《Programming WPF》翻譯 第5章 4.元素類型樣式

    <Grid.Resources>

《Programming WPF》翻譯 第5章 4.元素類型樣式

      <Style TargetType="{x:Type Button}">

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

      <Style TargetType="{x:Type TextBlock}">

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

    </Grid.Resources>

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

  </Grid>

《Programming WPF》翻譯 第5章 4.元素類型樣式

  <!-- Buttons and TextBlocks outside the Grid are unaffected -->

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

或者,如果你想使你的樣式在你的工程中有更大的作用區域,你可以将它們放在應用程式範圍内,如示例

5-19。

示例5-19

《Programming WPF》翻譯 第5章 4.元素類型樣式

<!-- MyApp.xaml -->

《Programming WPF》翻譯 第5章 4.元素類型樣式

<Application 

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

  <!-- every Button or TextBlock in the Application is affected -->

《Programming WPF》翻譯 第5章 4.元素類型樣式

  <Application.Resources>

《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式
《Programming WPF》翻譯 第5章 4.元素類型樣式

  </Application.Resources>

《Programming WPF》翻譯 第5章 4.元素類型樣式

</Application>

一般而言,了解元素類型的樣式範圍規則是有用的,是以你可以判斷它們在各種

WPF對象模型中的效果。第6章更加詳細地讨論了所有種類的資源範圍,包括樣式。

命名樣式和元素類型樣式

當對命名樣式還是元素類型樣式使用作出選擇時,我們的一位評論家說,按照他的經驗,一旦你有10個以上給予元素類型的樣式,對一個特定的控件擷取它的樣式保持跟蹤将非常困難。這是一個原因是我成為命名樣式的粉絲。

對于我而言,樣式是一個在一個地方應用到内容的語義标簽,并且在另一個地方也能獲得一個可視化表示。正如我們的TTT示例那樣簡單,我們已經得到了兩個樣式,一個是為了狀态文字,另一個是為了移動的單元;在我們這麼做之前,我們将要得到更多。主要的差別因素是我們在這些元素中顯示的資料種類,而不是保持資料的元素類型。實際上,我們有一些配置設定到TextBox控件的樣式,這将無論如何打消基于類型的樣式,甚至是這個簡單的應用程式。