2016-02-19 11 views
0

我想爲ToggleBox製作一個樣式,以便它在點擊時改變顏色,我已經成功地給它一個鼠標移過來的下拉陰影,但是由於某種原因,當我點擊它而不是進入檢查狀態它保持在鼠標懸停狀態。WPF ToggleButton在選中時不會改變顏色

它的XAML是:

 <!--Primary toggle button style--> 
    <Style x:Key="PrimaryRoundedToggleButton" TargetType="ToggleButton"> 
     <Setter Property="Margin" Value="5"/> 
     <Setter Property="Width" Value="180"/> 
     <Setter Property="Height" Value="30"/> 
     <Setter Property="Background" Value="#E08827"/> 
     <Setter Property="Foreground" Value="White"/> 
     <Setter Property="FontSize" Value="15"/> 
     <Setter Property="FontWeight" Value="DemiBold"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ToggleButton"> 
        <Border CornerRadius="4" Background="{TemplateBinding Background}"> 
         <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ToggleButton"> 
          <Border CornerRadius="4" Background="{TemplateBinding Background}"> 
           <Border.Effect> 
            <DropShadowEffect BlurRadius="4" ShadowDepth="3" Direction="300" Opacity="0.5"/> 
           </Border.Effect> 
           <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
          </Border> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ToggleButton"> 
          <Border CornerRadius="4" Background="#58585a"> 
           <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
          </Border> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

且事件處理程序是:

 private void primaryToggleButton_Checked(object sender, RoutedEventArgs e) 
    { 
     primaryToggleButton.Content = "Restarting..."; 

     serviceStatusChangeTimeout = Int32.Parse(ConfigurationManager.AppSettings.Get("serviceStatusChangeTimeout")); 
     websiteStatusChangeTimeout = Int32.Parse(ConfigurationManager.AppSettings.Get("websiteStatusChangeTimeout")); 

     MidTier.ServiceRestart(serviceStatusChangeTimeout); 

     Thread.Sleep(1000); 
     cacheBuilderStatus.Source = new BitmapImage(new Uri("pack://application:,,,/WpfCustomControlLibrary1;component/Resources/checkbox-complete.png")); 

     MidTier.CheckLastModified(); 
     MidTier.webSiteRestart(); 
     MidTier.applicationPoolRecycle(); 

     primaryToggleButton.IsChecked = false; 
    } 

我也想有它更改按鈕上的文字爲好,但我記得尋找如何在XAML中這樣做,所以我會在問這個問題之前再試一次。

謝謝。

回答

0

因此,您的按鈕停留在鼠標懸停狀態,因爲當鼠標未結束時(<Trigger Property="IsMouseOver" Value="false"><!--reset things--></Trigger>)沒有觸發器。由於您必須擁有多個觸發器,並且可以開啓和關閉,您可能需要查看MultiDataTrigger。目前這不是你需要的,但我發現它很快就會出現。

How can I provide multiple conditions for data trigger in WPF?

+0

好,所以邏輯是切換按鈕不會進入缺血狀態,因爲我不能點擊按鈕,然後立即刪除鼠標,所以按鈕首先進入缺血狀態,然後立即回到ismouseover,因爲鼠標仍然在按鈕上?在那種情況下,我該如何使缺陷狀態覆蓋鼠標以上的屬性? – Exitialis

+0

我會研究多數據觸發器,其中所有條件必須爲真才能觸發觸發器,或者使用數據綁定來設置值在C#源代碼中計算的值。數據綁定功能非常強大,因爲您可以在C#源代碼中進行所有計算,然後將您的XAML屬性設置爲您的計算值。 – xtreampb

0

你應該做一個觸發時的IsMouseOver值爲false。

此外,我建議你重寫模板,你需要什麼:

<Setter Property="Template"> 
    ... 
    </ControlTemplate> 

和馬克ControlTemplate.Triggers您的觸發器。

+0

鼠標懸停是錯誤的。你能解釋一下爲什麼你會推薦騎着模板嗎? – Exitialis

相關問題