2011-03-03 78 views
14

比方說,我有4個邊框一個用戶控件:WPF:如何設計一個像CSS樣式的類?

<Border /> 
<Border /> 
<Border /> 
<Border /> 

現在在我的資源,我可以去:

<Style TargetType="{x:Type Border}"> 
    ... change some properties here 
</Style> 

現在,這一切都很好,但它會針對所有邊界在我的用戶。 但是,如果我只想瞄準他們的一個子集呢?

我想去:

<Border Class="Type1" /> 
<Border Class="Type1" /> 
<Border /> 
<Border /> 

然後去:

<Style TargetType="{x:Type Border}" TargetClass="Type1"> 
    ... change some properties here 
</Style> 

但這顯然不存在,有一些其他的方式,我可以實現我後我? 謝謝

回答

1

您可以使用x:key和Border的StaticResource(或DynamicResource)屬性直接在<Border>上設置樣式。如果您想在運行時更改樣式,那麼您應該傾向於通過StaticResource使用DynamicResource。

<Style x:Key="something" TargetType="{x:Type Border}"> 
</Style> 

<Border style="{StaticResource something}"/> 
13

雖然語法不像CSS那麼幹淨,但更具體一些。

要建立在你的榜樣,你要找的是什麼:

<Border Style="{StaticResource Type1}" /> 
<Border Style="{StaticResource Type1}" /> 
<Border /> 
<Border /> 

然後去:

<Style TargetType="{x:Type Border}" x:Key="Type1"> 
    ... change some properties here 
</Style> 

請記住,WPF風格實際上並不像級聯CSS一樣。

更詳細的造型參考: http://dotnetslackers.com/articles/wpf/StylesResourcesAndControlTemplatesInWPF.aspx

2
<Style x:Key="styleKey" TargetType="{x:Type Border}"> 
    ... change some properties here 
</Style> 

<Border Style="{StaticResource styleKey}" 
9

的東西,我覺得大多數人不知道的是WPF的能力Style.Resources中嵌套樣式。例如:

<!-- Define a new style for Borders called InfoBox, that will have a red background, 
    and further override all buttons within it to have Yellow Text. An extra style, 
    "Strawberry" is also defined, that lets specific buttons be selected to be styled 
    as Green FG on DarkRed BG --> 
<Style TargetType="{x:Type Border}" x:Key="InfoBox"> 
    <Setter Property="Background" Value="Red"/> 
    <Style.Resources> 
    <Style TargetType="{x:Type Button}"> 
     <Setter Property="Foreground" Value="DarkYellow"/> 
    </Style> 
    <Style TargetType="{x:Type Button}" x:Key="Strawberry"> 
     <Setter Property="Foreground" Value="Green"/> 
     <Setter Property="Background" Value="DarkRed"/> 
    </Style> 
    </Style.Resources> 
</Style> 

... 

<Border Style="{DynamicResource InfoBox}"> 
    <StackPanel> 
    <Button Content="I am a banana!"/> 
    <Button Style="{DynamicResource Strawberry}" Content="I am red!"/> 
    </StackPanel> 
</Border> 

雖然不是完全一樣的CSS(沒有標準僞選擇太多的支持),這給你一個巨大的力量和柔韌性的量。將它與熟練使用ItemsControls相結合,你可以做一些偉大的事情。

+0

Style.Resources'字典中的默認樣式似乎沒有解析。 – codekaizen 2012-11-21 21:53:16

+0

在WPF中,它看起來像在VS Designer中工作,但它會發出警告「The resource」Strawberry「無法解析。」一旦我解除了草莓的命令,警告就消失了。但必須使用DynamicResource。靜態資源會拋出未解決的錯誤。 – 2015-04-27 17:11:44