Setters

書名:WPF專業(yè)編程指南
作者:李應(yīng)保
出版社:電子工業(yè)出版社
出版時間:2010-01
ISBN:9787121100116


一、Setters

  • Setters是Style類中重要的屬性,它的類型是SetterBaseCollection。
    SetterBaseCollection是一個可放入SetterBase類型對象的包容器,所以只要是從SetterBase中派生出來的對象都可以放入到SetterBaseCollection中。
    實際上從SetterBase中派生出來的有兩個類:一個是Setter,另一個是EventSetter。
  • SetterBase類中只定義了一個屬性IsSealed和一個方法CheckSealed。
    Setter類中定義了三個屬性:Property、Value、TargetName。
    在XAML中使用Setter的語法如下:
  <Setter Property=  "Control.FontSize", Value= "24"/>  (最常用)
  Setter>                                                 (有時用)
  ….
  </Setter>
  <Setter Property= "…", Value= "…", TargetName= "…" />

在C#中,就是創(chuàng)建Setter對象:

  Setter mySetter = new Setter();
  Setter mySetter = new Setter(Control.FontSize ,24    );
  Setter mySetter = new Setter(Control.FontSize ,24 ,"Button"   );
  • Setter類中的Perperty一定要是相關(guān)屬性,在說明該相關(guān)屬性時還要加上屬性所在的類(可以是基類也可以是具體的派生類)。比如上例中用的Control,實際上是WPF中的一個基類。

二、例子

  <Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SimpleTextStyle" Height="300" Width="300">
    <TextBlock Height ="100">
      <TextBlock.Style>
        <Style >
          <Setter Property ="TextBlock.Background" Value ="Yellow" />
          <Setter Property ="TextBlock.FontSize" Value ="24" />
          <Setter Property ="TextBlock.FontFamily"
                Value ="Times New Roman" />
          <Setter Property ="TextBlock.FontWeight" Value ="Bold" />
        </Style>
      </TextBlock.Style>
        Test WPF  Style
    </TextBlock>
  </Window>

在這里共設(shè)置了TextBlock控件的4個屬性,即Background、FontSize、Font-Family和FontWeight。
查一下.NET文檔,很容易看出這幾個屬性都是相關(guān)屬性,其運行結(jié)果如圖9-1所示


圖9-1 設(shè)置TextBlock控件風(fēng)格

三、風(fēng)格改變

  • 在實際應(yīng)用中,我們很少對某一個控件使用風(fēng)格。使用風(fēng)格的目的是:當改變某個風(fēng)格時,希望所有使用該風(fēng)格的控件都會改變它們的表現(xiàn)形式,從而不必對某控件逐一進行修改。
    怎樣達到這一目標呢?
    顯然,我們不能只在控件中使用風(fēng)格;應(yīng)該把風(fēng)格作為資源(Resource)的一部分 。
    我們知道,在WPF中,F(xiàn)rameWorkElement、FrameWorkContentElement和Application三大類里都含有Resources屬性,即在這三個類及其派生類中,都可以使用資源。

  • 一旦在資源中定義了風(fēng)格,就可以在具體的控件中引用相應(yīng)的風(fēng)格,從而達到多個控件具有統(tǒng)一風(fēng)格的視覺效果。
    通常我們把風(fēng)格定義在Application的Resource中,這樣整個應(yīng)用程序都可以共享同一風(fēng)格。

  <Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="StyleInResourceSection" Height="300" Width="400">
  <Window.Resources >
    <Style  x:Key ="largeText">
      <Setter Property ="Control.Foreground" Value ="Blue" />
      <Setter Property ="Control.FontSize" Value ="24" />
      <Setter Property ="Control.FontFamily" Value="Times New Roman"/>
      <Setter Property ="Control.FontWeight" Value ="Bold" />
    </Style>
  </Window.Resources>
  <StackPanel >
    <TextBlock  Style="{StaticResource  largeText}">旅望因高盡
    </TextBlock>
    <TextBlock  Style="{StaticResource  largeText}">鄉(xiāng)心遇物悲
    </TextBlock>
    <Button  Style ="{StaticResource  largeText}">旅思</Button>
  </StackPanel>
  </Window>
  • 在XAML中加入<Window.Resources>一節(jié),然后在其中定義風(fēng)格(Style)。在定義風(fēng)格時,要使用x:Key,在引用風(fēng)格時要使用“{StaticResource keyValue}”,這在為同一控件定義不同的風(fēng)格時,非常方便。

  • 由于在WPF中控件類間存在繼承關(guān)系,某些派生類中的屬性是從基類中繼承的,若設(shè)置基類的屬性,那么這些屬性會自動在派生類中起作用。因此可以利用這個特點來靈活地使用屬性。比如,筆者把上例中的風(fēng)格中Property的值改為Control:
    然后在StackPanel中加入Button元素,則largeText風(fēng)格就同時對TextBlock和Button控件起作用了。原因是TextBlock和Button控件都是從Control類中派生出來的,這段XAML的運行結(jié)果如圖9-3所示。


    圖9-3 風(fēng)格用在Control的不同派生類中
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容