【问题标题】:Button Triggerevent IsPressed isn't working按钮 Triggerevent IsPressed 不起作用
【发布时间】:2021-05-08 11:54:35
【问题描述】:

我想更改我的两个Buttons 在StackPanel 中被点击时的背景颜色。在Window.Ressources 中,我实现了两个触发器IsMouseOver 和IsPressed。事件IsMouseOver 正在工作,我得到了我想要的悬停效果,但事件IsPressed 不工作。我没有看到问题,有人可以帮助我吗?

<Window x:Class="Einstellungen_awintaONE.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Einstellungen_awintaONE"
        mc:Ignorable="d"
        Title="awintaONE Einstellungen" Height="500" Width="850">
    <Window.Resources>
        <Style x:Key="_ButtonStyle" TargetType="Button">
            <Setter Property="Foreground" Value="#585757"/>
            <Setter Property="Background" Value="#BBBBBB"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button">
                        <Border Name="_Border" Padding="2" SnapsToDevicePixels="true">
                            <ContentPresenter VerticalAlignment="Center" Margin="15,0,0,0" />
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter TargetName="_Border" Property="Background" Value="Gray"/>
                                <Setter Property="Foreground" Value="White"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True">
                                <Setter TargetName="_Border" Property="Background" Value="Gray"/>
                                <Setter  Property="Foreground" Value="White"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="180" Name="Navigation" />
            <ColumnDefinition  Name="Einstellungen"/>          
        </Grid.ColumnDefinitions>
        
        <Border Grid.Column="0" Background="#BBBBBB">
            <Grid Grid.Column="0">
                <Grid.RowDefinitions >
                    <RowDefinition Height="40"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>            
                <StackPanel   Grid.Row="1" Grid.Column="0" >
                    <Button Content="Systeminformationen" Style="{DynamicResource _ButtonStyle}"  Height="30" />                    
                    <Button Content="Einstellungsassistent" Style="{DynamicResource _ButtonStyle}" Height="30"  />
                </StackPanel>                
            </Grid>
        </Border>               
    </Grid>    
</Window>

【问题讨论】:

  • 尝试设置普通背景:&lt;Border Name="_Border" Background="{TemplateBinding Background}" Padding="2" SnapsToDevicePixels="true"&gt;

标签: wpf xaml button triggers background-color


【解决方案1】:

Mouse Over 和 Pressed 触发器工作得很好,但是您看不到它,因为在两个触发器中您分配了相同的背景颜色,因此没有视觉效果两种状态的区别。

除此之外,您没有将 Border 的 Background 属性绑定到模板化父级,这意味着您的样式 (#BBBBBB) 中的背景设置器未应用。这是按钮的初始静态状态。

它只是看起来是对的,因为它的边框没有背景,你可以通过它看到父 Grid 的背景。要解决此问题,请将TemplateBinding 添加到您的Border。

<Border Name="_Border" Background="{TemplateBinding Background}"  Padding="2" SnapsToDevicePixels="true">

您可以对 Foreground 属性执行相同的操作,尽管这个属性也可以正常工作。


为您的 cmets 更新。如果您希望在单击按钮后颜色保持不变,这意味着它保持单击状态,那么您使用了错误的控件。请改用ToggleButton。

<Style x:Key="_ToggleButtonStyle" TargetType="ToggleButton">
   <Setter Property="Foreground" Value="#585757"/>
   <Setter Property="Background" Value="#BBBBBB"/>
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="ToggleButton">
            <Border Name="_Border" Background="{TemplateBinding Background}"  Padding="2" SnapsToDevicePixels="true">
               <ContentPresenter VerticalAlignment="Center" Margin="15,0,0,0" />
            </Border>
            <ControlTemplate.Triggers>
               <Trigger Property="IsMouseOver" Value="true">
                  <Setter TargetName="_Border" Property="Background" Value="Gray"/>
                  <Setter Property="Foreground" Value="White"/>
               </Trigger>
               <Trigger Property="IsPressed" Value="True">
                  <Setter TargetName="_Border" Property="Background" Value="Gray"/>
                  <Setter  Property="Foreground" Value="White"/>
               </Trigger>
               <Trigger Property="IsChecked" Value="True">
                  <Setter TargetName="_Border" Property="Background" Value="Gray"/>
                  <Setter  Property="Foreground" Value="White"/>
               </Trigger>
            </ControlTemplate.Triggers>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>
<StackPanel   Grid.Row="1" Grid.Column="0" >
   <ToggleButton Content="Systeminformationen" Style="{DynamicResource _ToggleButtonStyle}"  Height="30" />                    
   <ToggleButton Content="Einstellungsassistent" Style="{DynamicResource _ToggleButtonStyle}" Height="30"  />
</StackPanel>

我看到您的下一个问题是,如何在单击其他按钮时再次切换按钮?答案是你没有。您使用了错误的控件,因为我猜您的问题是另一个问题。这很可能是XY problem。

如果您想创建侧边栏或类似内容,请使用 Selector 控件,例如将 TabStripPlacement 设置为 Left 的 TabControl 或具有适当样式的ListBox。

【讨论】:

  • 好的,谢谢,但我希望单击按钮后更改的背景颜色和前景色保持不变。我该怎么做?
猜你喜欢
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多