2009-01-29 48 views
2

這個問題的靈感來自this recent question和我在WPF開發中遇到的其他情況。我如何知道在控件上設置樣式是否足以覆蓋某些默認行爲與創建新控件模板?如何知道是使用樣式還是覆蓋控件模板?

更具體地說,在上面的問題中,作者希望在選中時更改ListBoxItem的外觀。 (見下面轉載的代碼)。一切正常,除了背景屬性。人們應該如何知道他們應該爲此重寫控制模板?

<Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Content" Value="{Binding Path=Name}"/> 
     <Setter Property="Margin" Value="2"/> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="FontWeight" Value="Bold"/> 
       <Setter Property="FontSize" Value="18"/> 
       <Setter Property="Background" Value="Yellow"/> 
       <Setter Property="Foreground" Value="Red"/> 
      </Trigger> 
     </Style.Triggers> 

    </Style> 
+0

Hey Siz。如果我們已經進入IsSelected屬性問題,您是否可以更改問題的標題? ;) – 2009-01-30 12:38:06

回答

3

樣式可以被認爲非常接近HTML中的CSS樣式。如果您只想更改控件的基本屬性(如Background,Foreground或其公開的任何屬性),那麼Style就是您所需要的。樣式還允許您應用觸發器,因此對於動畫,樣式也是足夠的。

如果您發現想要更改控件上的內部行爲/內部工作方式,那麼控件模板就是您想要的。例如,如果您想通過添加某種網格行爲來更改按鈕佈局的方式,那麼使用控件模板是前進的方向。

+0

好吧,我明白了。但看看我鏈接到的問題。他希望在選中時更改ListBoxItem的行爲(IsSelected屬性設置爲true)。他可以做任何事情,但是,他不能改變背景。所以...人們如何知道如何改變這個特定的財產? – 2009-01-29 16:09:33

0

不幸的是,對於您的具體示例,除非您嘗試,否則您不知道。基本上,你首先嚐試一個樣式....如果這不起作用,然後你寫一個ControlTemplate。出於Ray提到的原因,您通常最終只能編寫ControlTemplates。

我的猜測是你試圖設置的觸發器已經在ControlTemplate中硬編碼......這是不好的設計imo,因爲它阻止了Style覆蓋它。

0

「背景」我認爲它是指在選擇時圍繞ListBoxItem的「藍色」矩形?

這實際上是FocusVisualStyle屬性,它是描述項目聚焦時的外觀樣式的樣式。 Control明確地設置了這個屬性(描述here),所以爲了覆蓋它,你將不得不重新定義控制模板,確保使用默認的樣式設置器將其設置爲{x:Null}。

4

至於是否使用樣式或模板Ray提供了很好的響應。

至於如何解決您的問題,而無需創建模板,也許我可以提供幫助。

背景顏色由SystemColors設置。使用混合和創建模板,你可以看到確切的xaml。

所以如果沒有模板!是一項要求,您可以隨時更改該資源。

例子:

<ListBox> 
     <ListBox.Resources> 
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
          Color="Yellow" /> 

      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Content" Value="{Binding Path=Name}"/> 
       <Setter Property="Margin" Value="2"/> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="FontWeight" Value="Bold"/> 
         <Setter Property="FontSize" Value="18"/>        
         <Setter Property="Foreground" Value="Red"/> 
        </Trigger> 
       </Style.Triggers> 

      </Style> 

     </ListBox.Resources> 

     <ListBoxItem>Test 1</ListBoxItem> 
     <ListBoxItem>Test 2</ListBoxItem> 
     <ListBoxItem>Test 3</ListBoxItem> 
    </ListBox> 

這會給你該給定列表框的背景顏色,而不是搞砸任何事在其他應用程序。

+0

不是我正在尋找的;但一個很好的答案。 +1。 – 2009-01-30 14:09:07

相關問題