2011-08-02 32 views
0

我想在按下時改變ToggleButton的顏色,並保持該顏色,直到再次按下。目前鼠標懸停按鈕後鼠標離開切換按鈕後會改變顏色。我拿走了鼠標懸停的顏色變化,這讓我可以將顏色設置爲Checked狀態,但我不想失去鼠標懸停效果。有沒有辦法兼得?我創建了自己的擴展器,教我自己創建控件,但看不出如何同時使用鼠標懸停和按下的顏色,在我的示例中,只有當按鈕未被點擊/檢查時,纔會重置statys,mouseover。我正在關閉此ToggleButton樣式:http://msdn.microsoft.com/en-us/library/cc296245(v=vs.95).aspxToggleButton MouseOver選中按下的問題

+0

你能描述一下你真正想要的效果嗎?默認模板通過使用漸變的方向反饋選中的狀態。如果你不使用那個按鈕被選中並且鼠標結束時你想要什麼外觀? – AnthonyWJones

+1

您遇到與此問題相同的問題:http://stackoverflow.com/questions/3596026/custom-styled-listbox-how-can-i-keep-the-style-for-a-selected-item/ 3596570#3596570 – Denis

回答

2

This MSDN Link 的說明部分的權利要求下:

的ControlTemplate作者的VisualState對象到VisualStateGroup在的ControlTemplate來指定控制的視覺行爲。你在同一個VisualStateGroup中放置彼此互斥的狀態。例如,CheckBox有兩個VisualStateGroup對象。其中一個包含Normal,MouseOver,Pressed和Disabled狀態。另一個包含狀態,Checked,UnChecked和Indeterminate。 CheckBox可以同時處於MouseOver和UnChecked狀態,但它不能同時處於MouseOver和Pressed狀態。

我對silverlight相當陌生,但它看起來像你將不得不使用第二個控件,如邊框或矩形,不知道這是否是一個選項,但你也可以設置它來更改邊框刷在鼠標上的顏色。

1

觸發器的順序很重要。此樣式按您指定的方式工作。

<Style x:Key="{x:Type ToggleButton}" TargetType="{x:Type ToggleButton}"> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <Border Name="Border" BorderThickness="1" Background="Gray" BorderBrush="Gray"> 
        <ContentPresenter Name="ContentHost" Margin="8,3" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="true" /> 
       </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="true"> 
          <Setter TargetName="Border" Property="Background" Value="Yellow" /> 
         <Setter TargetName="Border" Property="BorderBrush" Value="Yellow" /> 
         </Trigger> 
         <Trigger Property="IsChecked" Value="True"> 
          <Setter TargetName="Border" Property="Background" Value="Red" /> 
          <Setter TargetName="Border" Property="BorderBrush" Value="Red" /> 
         </Trigger> 
         <Trigger Property="IsPressed" Value="true"> 
         <Setter TargetName="Border" Property="Background" Value="Green" /> 
         <Setter TargetName="Border" Property="BorderBrush" Value="Green" /> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter TargetName="Border" Property="Opacity" Value="0.25" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

這個工作在SilverLight中嗎?或者只是WPF? – Terco

+0

@Wallstreet如果你以什麼方式展開觸發器的順序很重要,我也會很感激。 – StephenT

+0

@Bob:不,這純粹是一個WPF的答案,在Silverlight中不起作用。 – AnthonyWJones