【问题标题】:IsPressed event not triggering in WPF在 WPF 中未触发 IsPressed 事件
【发布时间】:2014-03-13 23:19:06
【问题描述】:

我正在尝试为 WPF 应用程序编辑按钮的默认模板,“MouseEnter”和“MouseLeave”事件正在工作,问题在于基本上似乎没有被触发的“IsPressed”事件。我也删除了

RenderPressed="{TemplateBinding IsPressed}"

部分,但按钮似乎忽略了我的 IsPressed 事件 代码如下:

<LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
    <GradientStop Color="#F3F3F3" Offset="0"/>
    <GradientStop Color="#EBEBEB" Offset="0.5"/>
    <GradientStop Color="#DDDDDD" Offset="0.5"/>
    <GradientStop Color="#CDCDCD" Offset="1"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
<Style x:Key="ButtonDark1" 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}">
                <Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderDefaulted="{TemplateBinding IsDefaulted}" SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Themes:ButtonChrome>
                <ControlTemplate.Triggers>
                    <EventTrigger RoutedEvent="Control.MouseEnter">
                        <BeginStoryboard>
                            <Storyboard >
                                <DoubleAnimation Duration="0:0:0.3" To="0.8" Storyboard.TargetProperty="Opacity"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="Control.MouseLeave">
                        <BeginStoryboard>
                            <Storyboard >
                                <DoubleAnimation Duration="0:0:0.3" To="0.5" Storyboard.TargetProperty="Opacity"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <Trigger Property="IsKeyboardFocused" Value="true">
                        <Setter Property="RenderDefaulted" TargetName="Chrome" Value="false"/>
                    </Trigger>
                    <Trigger Property="ToggleButton.IsChecked" Value="true">
                        <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="#ADADAD"/>
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Foreground" Value="LightBlue"></Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

提前致谢。

【问题讨论】:

    标签: wpf xaml events button


    【解决方案1】:

    再一次,我们有一个问题,有人弄乱了他们的ControlTemplate 并希望其他人修复它。答案总是一样的...从您的Button 的默认ControlTemplate 开始。您可以在 MSDN 上的 Button Styles and Templates 页面中为您的 Button 找到默认的 ControlTemplate

    如果您查看链接页面,您会看到一个 VisualStateManager.VisualStateGroups 集合,在该集合中,您会发现一个名为 PressedVisualState。再往上一点,你应该会看到:

    <VisualTransition GeneratedDuration="0" To="Pressed" />
    

    这些是管理视觉Pressed 状态的内容。

    更改默认 ControlTemplate 时,最好从整个默认 XAML 开始,并首先在您的自定义 ControlTemplate 中使用它。一旦你让它工作了,然后你就可以开始一点一点地操作它,并在每次更改后定期检查它。然后,如果它一次不起作用,您可以撤消最后的一些更改并找出您做错了什么。

    【讨论】:

    • 抱歉,我是 WPF 新手,我将按照您所说的从默认模板开始,而不是编辑现有模板,希望这会得到解决,谢谢。
    • 完美,这行得通,从默认模板开始,它向我展示了我以错误的方式分配事件中的属性。我使用了一种默认画笔来更改颜色,但它不起作用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多