【问题标题】:Custom Control event not working自定义控件事件不起作用
【发布时间】:2014-04-04 15:22:04
【问题描述】:

我创建了一个具有悬停/单击效果的自定义按钮。我不知道为什么鼠标事件不适用于此。类定义中重写的事件处理程序仍然有效。

这是自定义控件的 XAML:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CSOCodeBox_WPF">

<Style TargetType="{x:Type local:HoverButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:HoverButton}">
                 <Rectangle x:Name="btnImage" HorizontalAlignment="Left" VerticalAlignment="Top" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
                     <Rectangle.Fill>
                         <ImageBrush ImageSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Image}"/>
                     </Rectangle.Fill>
                 </Rectangle>
                 <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter TargetName="btnImage" Property="Fill">
                            <Setter.Value>
                                <ImageBrush ImageSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HoverImage}"/>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <Trigger Property="IsMouseCaptured" Value="True">
                        <Setter TargetName="btnImage" Property="Fill">
                            <Setter.Value>
                                <ImageBrush ImageSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=PressImage}"/>
                            </Setter.Value>
                        </Setter>
                    </Trigger>                        
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

将控件添加到主窗口:

<my:HoverButton x:Name="hoverButton1" Width="201" Height="121" Canvas.Left="235" Canvas.Top="500" Image="/CSOCodeBox_WPF;component/GFX/Button_None.png" HoverImage="/CSOCodeBox_WPF;component/GFX/Button_Ready.png" PressImage="/CSOCodeBox_WPF;component/GFX/Button_Clicking.png" MouseDown="hoverButton1_MouseDown_1"></my:HoverButton>

事件:

        private void hoverButton1_MouseDown_1(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("Button clicked");
    }

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    在这种情况下,请尝试使用 PreviewMouseDown 事件而不是 MouseDown。

    预览事件在 WPF 中的正常(路由)事件之前引发,许多事情可以抑制后者。抑制可能来自很多地方,但您几乎总是可以确定您可以处理预览事件。

    【讨论】:

    • 顺便说一句,什么会抑制路由事件?
    • @BienPham 我可以直接说的是,这两种类型并不独立。首先,隧道(预览)事件(例如 PreviewMouseDown)首先触发,而在隧道时,这可以被抑制。但是,如果隧道事件设法到达触发它的源对象,则冒泡(正常)事件(例如 MouseDown)将从源触发并向上流动到顶层元素(窗口)。至于什么会抑制事件,您的层次结构中的某些元素可能是原因。但是您始终可以处理隧道事件。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    相关资源
    最近更新 更多