2009-11-06 64 views
4

我可能錯過了WPF的一些顯而易見的東西,但是有可能創建符合目標控件的子控件分層次工作的樣式嗎?爲了更好地解釋,請考慮CSS如何對HTML進行樣式設計。您可以通過選擇層次目標與CSS控制:WPF樣式階層?

div > span em 
{ 
    color: blue; 
} 

ul.class > li ul li 
{ 
    display: block; 
    margin: 0px; 
} 

是否有可能實現與WPF風格是一回事嗎?到目前爲止,我一直在爲每種類型的控件創建樣式,或者直接將其應用於控件的命名樣式。然而,我最終的風格比我真正打算的要多得多,我幾乎不可能將控制結構組合在一起。

感謝您的任何見解。

UPDATE:

這裏是我想什麼,能夠做一個例子。請注意,只有根ListView控件應用了一個Style。我希望能夠針對任何一個CellTemplates中的任何一個子控件,而無需直接將樣式應用於每個這些子控件。這使得我的視圖佈局標記與風格標記更加分離和隔離,給我更多的自由來改變風格,而無需爲整個應用程序中的每個控件都明確地創建風格。

<Grid> 
    <ListView Style="{StaticResource ProcessableItemsListView}"> 
    <ListView.View> 
     <GridView> 
     <GridViewColumn Width="10"> 
      <GridViewColumn.CellTemplate> 
      <Grid> 
       <CheckBox Value="{Binging ...}" /> 
      </Grid> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
     <GridViewColumn Width="*"> 
      <GridViewColumn.CellTemplate> 
      <Grid> 
       <TextBlock Text="{Binding ...}" /> 
      </Grid> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
     <GridViewColumn Width="80"> 
      <GridViewColumn.CellTemplate> 
      <Grid> 
       <Button Command="{Binding ...}">Process</Button> 
      </Grid> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
     <GridViewColumn Width="120"> 
      <GridViewColumn.CellTemplate> 
      <Grid> 
       <ProgressBar Value="{Binding ...}" /> 
      </Grid> 
      </GridViewColumn.CellTemplate> 
     </GridViewColumn> 
     </GridView> 
    </ListView.View> 
    </ListBiew> 
</Grid> 
+1

稍遲,但請參閱http://www.codeproject.com/Articles/36499/Using-CSS-Selectors-for-Styling-in-WPF – 2011-10-20 12:42:38

+0

@BorisB。謝謝!棒極了! – jrista 2011-10-22 02:50:07

回答

1

我會作出這樣的評論,但跑出來的字符

嗯的。鑑於來自使用隱式樣式的andyp的答案不能解決您的問題,我可以想到兩種稍微不同的方法來實現這一點。

一種是使網格單元格中的所有控件都是簡單的內容控件,並將數據對象綁定到控件的Content屬性。然後,您可以創建針對數據對象的隱式樣式,而不是UI控件類型。這是幾乎相同的東西,並建議,但只是從數據的角度來看它(這可能不適用於你的場景)

我能想到的另一個解決方案是創建一個針對某些根UIElement您的網格單元格控件繼承自。在樣式中添加一個觸發器,根據某些值(名稱,標籤和其他數據綁定)來交換控件的某些屬性。

不確定那些會得到你想要的,但它是值得一試。

此外,你可以發佈一個代碼片段,更清楚地顯示你正在嘗試完成什麼。解決這個問題的方法可能會簡單得多,我只是缺少了。

0

我不能百分之百肯定,如果我理解正確,不過我想你想要的是風格的基類,並已應用該樣式到它的後代了。

所以,如果,例如,你想要的風格組合框,你可以寫:

<Style x:Key="ComboBoxStyle" TargetType="ComboBox"> 
    ... 
</Style> 

而是你也可以這樣寫:

<Style x:Key="ComboBoxStyle" TargetType="Control"> 
    ... 
</Style> 

,並已應用的所有後代風格控制而不僅僅是ComboBoxes。該示例(直接和未編輯)取自this博客文章。

+0

你近,但我需要它走得更遠一點。它更多地沿着這條線:對於一個特定種類的ListView,其網格作爲其項目模板的根控制,使用此樣式設置單元格X,Y中的按鈕控件。這是否更有意義? – jrista 2009-11-06 21:17:24

+0

是的,我想我現在明白你的意思了,但我不知道如何在WPF中實現這一點。我知道的唯一方法是使用命名樣式並將其應用於該按鈕(這似乎是您想要避免的)。抱歉。 – andyp 2009-11-06 21:47:44

0

可以實現類似風格的繼承,通過使用支持算法FMP attribtue

<Style x:Key="A"> 
    <Setter Property="Background" Value="Blue" /> 
</Style> 

<Style x:Key="B" BasedOn="{StaticResource A}"> 
    <Setter Property="Foreground" Value="Red" /> 
</Style> 

<Style x:Key="C" BasedOn="{StaticResource A"> 
    <Setter Property="Foreground" Value="White" /> 
</Style> 

是否幫助CSS是如何做的?

+1

它不是風格的繼承。考慮一個層次結構,比如在itemtemplate中使用Grid的listview,並且網格在其單元中包含不同的控件。我如何以分層方式將該控件中的一個控件放置在該列表視圖的網格單元格中,而不必直接將該樣式直接應用於該控件?使用CSS,我可以使用選擇器進行定位:.listview .grid button {...} – jrista 2009-11-09 18:14:03