【问题标题】:How to correctly set an WPF EventTrigger in style?如何正确设置 WPF EventTrigger 的样式?
【发布时间】:2016-12-02 16:08:23
【问题描述】:

我有一个 WPF 样式,它是一个边框。它用于按钮。

<Style x:Key="RoundCorner" TargetType="{x:Type Button}">
    <Setter Property="ClickMode" Value="Press"/>
    <EventSetter Event="PreviewMouseUp" Handler="RegularButtonRelease"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid x:Name="grid">
                    <Border x:Name="border" CornerRadius="2" BorderBrush="#FF444444" BorderThickness="1">
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1.2" >
                                <GradientStop Color="#ffaaaaaa" Offset="0" />
                                <GradientStop Color="White" Offset="1" />
                            </LinearGradientBrush>                             
                        </Border.Background>
                    </Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <!--some style -->
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="True">
                        <!--some style -->                                
                    </Trigger>
                    <EventTrigger RoutedEvent="PreviewMouseLeftButtonUp">
                        <BeginStoryboard>
                            <Storyboard Duration="0:0:2" AutoReverse="False">
                                <ColorAnimation 
                                    Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
                                    FillBehavior="Stop" To="Tomato"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

当我松开鼠标单击按钮时,我想在给定时间内将边框背景颜色设置为不同的颜色。 (例如按钮按下时为黑色,松开时变为红色,然后变为白色)

使用上面的代码,我可以看到释放鼠标按钮后按钮颜色不断变化,并且我的事件处理程序RegularButtonRelease 也被连续触发。 很快应用程序挂起,并给了我一个System.StackOverflowException 例外。

如果我去掉 EventTrigger 风格,我的应用程序会正确执行,所以我的 EventTrigger 一定是错误的。

我的问题是,如何正确设置鼠标按钮上的背景颜色更改(使用 EventTrigger 或其他东西)?

更新:

我尝试同时设置边框和背景:

<ColorAnimation 
    Duration="0:0:0.8" 
    Storyboard.TargetName="border" 
    Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" 
    To="Red"/>
<ColorAnimation 
    Duration="0:0:0.8" 
    Storyboard.TargetName="border" 
    Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
    To="Red"/>

这次边界线变成了红色,就像一个魅力。但背景仍然存在,没有任何变化。

如何正确更改背景?

【问题讨论】:

  • 将此行添加到您的 Triggers 标签 - &lt;Trigger Property="IsMouseOver" Value="True"&gt;

标签: c# wpf eventtrigger


【解决方案1】:

首先,你的错误: 您正在尝试更改BackgroundColor,这是不可能的,因为它设置为LinearGradientBrush,其次您根本没有设置Storyboard.TargetName

我做了一些改变,首先:将x:Name分配给第二个GradientStop,然后在动画中使用这个x:Name作为Storyboard.TargetName="C2"

<Style x:Key="RoundCorner" TargetType="{x:Type Button}">
        <Setter Property="ClickMode" Value="Press"/>
        <EventSetter Event="PreviewMouseUp" Handler="RegularButtonRelease"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid x:Name="grid">
                        <Border x:Name="border" CornerRadius="2" BorderBrush="#FF444444" BorderThickness="1">
                            <Border.Background>
                                <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1.2" >
                                    <GradientStop Color="#ffaaaaaa" Offset="0" />
                                    <GradientStop x:Name="C2" Color="White" Offset="1" />
                                </LinearGradientBrush>
                            </Border.Background>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsPressed" Value="True">
                            <!--some style -->
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="True">
                            <!--some style -->
                        </Trigger>
                        <EventTrigger RoutedEvent="PreviewMouseLeftButtonUp">
                            <BeginStoryboard>
                                <Storyboard Duration="0:0:1" AutoReverse="False">
                                    <ColorAnimation Storyboard.TargetName="C2"
                                        Storyboard.TargetProperty="Color" 
                                        FillBehavior="Stop" To="Red"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

【讨论】:

    【解决方案2】:

    或者试试这个例子:

    <ControlTemplate.Triggers>
                <Trigger Property="IsPressed" Value="True">
                  <Setter Property="Background" TargetName="Background" Value="Red"/>
                </Trigger>
            </ControlTemplate.Triggers>
    

    供参考:

    Change color of Button when Mouse is over

    How do you change Background for a Button MouseOver in WPF?

    来到System.StackOverflowException 部分,根据MSDN,您可以通过在堆栈上创建太多大对象来获得StackOverflowExceptions,这通常是因为您的代码已进入调用相同函数链的状态一遍又一遍地。类似于递归。

    【讨论】:

    • 感谢您的评论,但我的风格已经有一个 IsPressed 更改边框背景的跟踪器。当我释放鼠标时,我想要另一种颜色,持续约 1 秒。
    • Pietu1998 answer 中的类似内容?
    • 呃,这对我没有帮助。但是现在我可以改变边界线的颜色,只是改变背景失败。我编辑了主帖。
    • 确保背景没有在按钮本身中设置,因为它会覆盖任何样式更改。在 Style 中使用 Setter 作为默认背景颜色。
    猜你喜欢
    • 2011-03-22
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多