2013-05-21 50 views
0

工作,我有一個樣式按鈕,如下:爲什麼這種風格是不是在WPF

<Style TargetType="Button" x:Key="BlackButton"> 
    <Setter Property="Background" Value="Black"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="red" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
       <ContentPresenter /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

,並在其上定義如下按鈕:

<Button Canvas.Left="19" Canvas.Top="520" Height="34" Width="107" 
     Style="{StaticResource BlackButton}" /> 

但是當我運行的應用程序,我看不到按鈕。其背景設置爲無。

如果我更改樣式如下:那麼按鈕顯示,但其背景是不會改變

<Style TargetType="Button" x:Key="BlackButton"> 
    <Setter Property="Background" Value="Black"/>   
</Style> 

(刪除模板)。

這個xaml代碼有什麼問題?

+0

也許空模板中的ContentPresenter? – stijn

+0

@stijn我刪除了它,但沒有成功:( – mans

+0

沒有什麼可以繪畫的東西了,給Button一個文本內容,它會顯示內容對於設置背景,在邊框內使用邊框和ContentPresenter – Jatin

回答

0

那麼你的ControlTemplate是簡單的空,雖然你有一個ControlPresenter在裏面。但由於其Content屬性未設置,因此它也是空的。要獲得Background,您必須添加一個Border

<Style TargetType="Button" x:Key="BlackButton"> 
    <Setter Property="Background" Value="Black"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="red" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
       <Border Background="{TemplateBinding Background}"> 
        <ContentPresenter Content="{TemplateBinding Content}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

這應該告訴你一些東西。

+0

它確實顯示背景正確,但是包含'Template' setter意味着該按鈕的chrome丟失了,從這個問題是不是很清楚這是OP所期望的! –

+0

它正在做我感興趣的事情,但是如果我向按鈕添加一些內容,它是左對齊的,我怎樣才能讓它居中對齊? – mans

+0

@mans:然後你可以像這樣設置ContentPresenter.Horizo​​ntalAlignment =「Center」'但是如果你只需要'MouseOver'行爲,你可能應該和Dan解。 – DHN

1

您已覆蓋控件的模板以設置MouseOver觸發器。這意味着您的控件模板是空的 - 所以沒有爲您的按鈕繪製任何內容。

可以更正通過移動觸發器的風格本身,就像這樣:

<Style TargetType="Button" x:Key="BlackButton"> 
    <Setter Property="Background" Value="Black"/> 
    <Style.Triggers> 

     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background" Value="red" /> 
     </Trigger> 
    </Style.Triggers>  
</Style> 

不過,你很可能會碰上現在是該按鈕的內置MouseOver動畫將覆蓋紅色背景。你會看到一個紅色的閃光,然後轉換到默認的Windows顏色。徹底解決這個問題的一種方法是獲取默認Button模板的完整副本(使用Expression Blend是最簡單的方法),並從中刪除動畫。

相關問題