2012-06-20 40 views
3

我有一個按鈕,我修改了它的模板,所以當按鈕被點擊和鼠標懸停(它變成綠色而不是淺藍色)時,它顯示不同的背景色。WPF按鈕後臺動作被代碼覆蓋

它自己很好用,但我需要根據某些狀態更改背景顏色,所以我需要更改代碼中的背景。

我的問題是當我更改代碼中的背景顏色時,它會正確更改,但不再爲click或mouseover事件更改背景。

我假設我以某種方式覆蓋了代碼中的背景顏色,所以我在模板中創建了該代碼。 我該如何解決這個問題,以便通過代碼更改背景,但仍然需要單擊和鼠標懸停的操作?

這裏是我的XAML代碼:

<Style x:Key="NodeButtonStyle" TargetType="{x:Type Button}"> 
      <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/> 
      <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/> 
      <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/> 
      <Setter Property="BorderThickness" Value="1"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
      <Setter Property="HorizontalContentAlignment" Value="Center"/> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
      <Setter Property="Padding" Value="1"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderDefaulted="{TemplateBinding IsDefaulted}" SnapsToDevicePixels="true" OverridesDefaultStyle="true"> 
          <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Microsoft_Windows_Themes:ButtonChrome> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsKeyboardFocused" Value="true"> 
           <Setter Property="Background"> 
            <Setter.Value> 
             <LinearGradientBrush EndPoint="0,1" StartPoint="0,0"> 
              <GradientStop Color="#FFCFF9C4" Offset="0"/> 
              <GradientStop Color="#FF249505" Offset="1"/> 
              <GradientStop Color="#FF58D835" Offset="0.5"/> 
             </LinearGradientBrush> 
            </Setter.Value> 
           </Setter> 
          </Trigger> 
          <Trigger Property="IsEnabled" Value="false"> 
           <Setter Property="Foreground" Value="#ADADAD"/> 
          </Trigger> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter Property="Background"> 
            <Setter.Value> 
             <LinearGradientBrush EndPoint="0,1" StartPoint="0,0" Opacity="0.5"> 
              <GradientStop Color="#FFCFF9C4" Offset="0"/> 
              <GradientStop Color="#FF249505" Offset="1"/> 
              <GradientStop Color="#FF58D835" Offset="0.5"/> 
             </LinearGradientBrush> 
            </Setter.Value> 
           </Setter> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

在代碼中,我只是做 button1.Background = newBrush;

我試着尋找類似的問題,但我找不到任何.. 任何幫助將不勝感激! 我使用blend 4 .net 3.5和C#。

+0

您不需要更改代碼中的背景。您應該將一些自定義狀態添加到您的模板中,然後使用VisualStateManager。對於.NET 3.5,您需要從Blend SDK獲取VSM(它內置於.NET 4中)。 –

回答

1

我相信你遇到DependecyProperty value precedence問題。在代碼中設置值將覆蓋樣式中設置的值。不要直接在後面的代碼中設置屬性,而是嘗試改變按鈕上的樣式。另一個解決方案是將你的背景綁定到你的DataContext上的一個屬性,並將它設置在那裏,而不是你的風格。

0

丹是正確的,這裏是你如何能得到周圍

    <Trigger Property="IsMouseOver" Value="True"> 
          <Trigger.EnterActions> 
           <BeginStoryboard Name="fred"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <LinearGradientBrush EndPoint="0,1" StartPoint="0,0" Opacity="0.5"> 
                 <GradientStop Color="#FFCFF9C4" Offset="0"/> 
                 <GradientStop Color="#FF249505" Offset="1"/> 
                 <GradientStop Color="#FF58D835" Offset="0.5"/> 
                </LinearGradientBrush> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </BeginStoryboard> 
          </Trigger.EnterActions> 
          <Trigger.ExitActions> 
           <RemoveStoryboard BeginStoryboardName="fred" /> 
          </Trigger.ExitActions> 
         </Trigger> 

注意,在場景中,我們使用ObjectAnimation代替ColorAnimation所以我們並不需要做出什麼樣的刷的任何假設背景最初設置爲。