繁体   English   中英

Code-Behind更改背景/前景后丢失样式触发

[英]Losing Style trigger after Code-Behind changes background/foreground

我试图使按钮像不和谐按钮一样具有三个状态。 有效(单击后),完全无效,然后将鼠标悬停。 您可以在此处看到所有这三种状态的颜色变化: https : //i.imgur.com/Mkc2Ro4.png

问题出在Click事件之后,因为要将其更改为基本状态,我直接设置了BG / FR。 当我这样做时,鼠标悬停事件将在那之后在该按钮中停止工作。 有什么想法可以在不影响样式触发的情况下如何将bg / fr设置为其初始值?

我尝试使用动态颜色,但根本没有设置。 所以我有点迷茫,TBH。

按钮的样式:

        <Style x:Key="MainMenuStyle" TargetType="{x:Type Button}">
            <Setter Property="Background" Value="#FF303136"/>
            <Setter Property="Foreground" Value="#FF6F7074"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border Background="{TemplateBinding Background}" Padding="30, 0, 0, 0">
                            <ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Center"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>

            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="#FF2A2A32"/>
                    <Setter Property="Foreground" Value="#FFBBBCB8"/>
                </Trigger>
            </Style.Triggers>
        </Style>

点击事件:

        private void Main_Menu_Swap(object sender, RoutedEventArgs e)
        {
            Button s = e.Source as Button;

            if (s != null)
            {
                InicioButton.Background = (Brush)new BrushConverter().ConvertFrom("#FF303136");
                InicioButton.Foreground = (Brush)new BrushConverter().ConvertFrom("#FF6F7074");
                RelatoriosButton.Background = (Brush)new BrushConverter().ConvertFrom("#FF303136");
                RelatoriosButton.Foreground = (Brush)new BrushConverter().ConvertFrom("#FF6F7074");
                AdministracaoButton.Background = (Brush)new BrushConverter().ConvertFrom("#FF303136");
                AdministracaoButton.Foreground = (Brush)new BrushConverter().ConvertFrom("#FF6F7074");

                s.Background = (Brush)new BrushConverter().ConvertFrom("#FF42464F");
                s.Foreground = (Brush)new BrushConverter().ConvertFrom("#FFCFD6DC");
            }
        }

纽扣:

        <Button x:Name="InicioButton" Content="Início" Click="Main_Menu_Swap" Style="{StaticResource MainMenuStyle}" HorizontalAlignment="Left" Margin="0,56,0,0" VerticalAlignment="Top" Width="155" Height="32" BorderThickness="0" Focusable="False" FontFamily="Arial" FontSize="15" Padding="30,0,0,0"/>
        <Button x:Name="RelatoriosButton" Click="Main_Menu_Swap" Content="Relatórios" Style="{StaticResource MainMenuStyle}" HorizontalAlignment="Left" Margin="0,152,0,0" VerticalAlignment="Top" Width="155" Height="32" BorderThickness="0" Focusable="False" FontFamily="Arial" FontSize="15" Padding="30,0,0,0"/>
        <Button x:Name="AdministracaoButton" Click="Main_Menu_Swap" Content="Administração" Style="{StaticResource MainMenuStyle}" HorizontalAlignment="Left" Margin="0,184,0,0" VerticalAlignment="Top" Width="155" Height="32" BorderThickness="0" Focusable="False" FontFamily="Arial" FontSize="15" Padding="30,0,0,0"/>

依赖项属性概述

绑定被视为本地值,这意味着如果您设置另一个本地值,则将消除绑定。 有关详细信息,请参见依赖项属性值优先级。

如果您对Click事件感兴趣,则应使用EventTrigger (或VisualStateManager )来使用XAML来操纵Button状态:

<Style x:Key="MainMenuStyle"
       TargetType="{x:Type Button}">
  <Setter Property="Background"
          Value="#FF303136" />
  <Setter Property="Foreground"
          Value="#FF6F7074" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Border x:Name="ButtonBorder" Background="{TemplateBinding Background}"
                Padding="30, 0, 0, 0">
          <ContentPresenter HorizontalAlignment="Left"
                            VerticalAlignment="Center" />
        </Border>
        <ControlTemplate.Triggers>
          <EventTrigger RoutedEvent="Click">
            <BeginStoryboard>
              <Storyboard>
                <ColorAnimation Storyboard.TargetName="ButtonBorder" 
                                Storyboard.TargetProperty="Background.(SolidColorBrush.Color)"
                                Duration="0:0:0" 
                                To="Coral" />
                <ColorAnimation Storyboard.Target="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                                Storyboard.TargetProperty="Foreground.(SolidColorBrush.Color)"
                                Duration="0:0:0"
                                To="White" />
              </Storyboard>
            </BeginStoryboard>
          </EventTrigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

但是,如果您只想提供按钮单击反馈,则应在Button.IsPressed属性上触发:

<Style x:Key="MainMenuStyle"
       TargetType="{x:Type Button}">
  <Setter Property="Background"
          Value="#FF303136" />
  <Setter Property="Foreground"
          Value="#FF6F7074" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type Button}">
        <Border x:Name="ButtonBorder" Background="{TemplateBinding Background}"
                Padding="30, 0, 0, 0">
          <ContentPresenter HorizontalAlignment="Left"
                            VerticalAlignment="Center" />
        </Border>
        <ControlTemplate.Triggers>                       
          <Trigger Property="IsPressed" Value="True">
            <Setter Property="Background"
                    Value="Coral" />
            <Setter Property="Foreground"
                    Value="White" />
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

编辑

设置背景颜色的原因是IsMouseOver触发器。 您描述的从Button.Click事件处理程序切换样式的解决方案并不干净,无法回答您的问题。

您希望Button在单击(选择)时改变颜色,同时将鼠标悬停在效果上。
因此,我建议用ToggleButton替换Button ToggleButton提供两种开箱即用的状态(选中和未选中):

<Style x:Key="MainMenuStyle"
       TargetType="{x:Type ToggleButton}">
  <Setter Property="Background"
          Value="#FF303136" />
  <Setter Property="Foreground"
          Value="#FF6F7074" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type ToggleButton}">
        <Border x:Name="ButtonBorder" Background="{TemplateBinding Background}"
                Padding="30, 0, 0, 0">
          <ContentPresenter HorizontalAlignment="Left"
                            VerticalAlignment="Center" />
        </Border>

        <ControlTemplate.Triggers>
          <Trigger Property="IsChecked" Value="True">
            <Setter Property="Background"
                    Value="Coral" />
            <Setter Property="Foreground"
                    Value="White" />    
          </Trigger>

          <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background"
                    Value="#FF2A2A32" />
            <Setter Property="Foreground"
                    Value="#FFBBBCB8" />    
          </Trigger>

          <MultiTrigger>
            <MultiTrigger.Conditions>
              <Condition Property="IsChecked" Value="True" />
              <Condition Property="IsMouseOver" Value="True" />
            </MultiTrigger.Conditions>
            <Setter Property="Background"
                    Value="Coral" />
            <Setter Property="Foreground"
                    Value="#FFBBBCB8" />
          </MultiTrigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>    
</Style>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM