書名: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所示

三、風(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的不同派生類中
