Silverlight滑块控件不触发mouseleftbuttondown事件

本文关键字:mouseleftbuttondown 事件 控件 Silverlight | 更新日期: 2023-09-27 18:15:59

我有一个像下面这样的滑块:

<Slider Minimum="0" Maximum="{Binding TotalNumberOfPositions,Mode=TwoWay}" Value="{Binding CurrentPosition, Mode=TwoWay}" Margin="5" >
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeftButtonUp" >
            <i:InvokeCommandAction Command="{Binding StopSeekPosition, Source={StaticResource ViewModel}}" />
        </i:EventTrigger>
        <i:EventTrigger EventName="MouseLeftButtonDown">
            <i:InvokeCommandAction Command="{Binding StartSeekPosition, Source={StaticResource ViewModel}}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Slider>

MouseLeftButtonUp事件正常,会触发命令。然而,MouseLeftButtonDown没有触发,或者它没有触发我的StartSeekPostion命令。我已经检查了MVVM中的命令名称。一切正常,但它不工作。我真的很喜欢这个。是我的代码有问题,还是关于滑块控制的问题?

Silverlight滑块控件不触发mouseleftbuttondown事件

您的代码也没有任何真正的错误,也不是Slider的问题,但是在处理RoutedEvents时,您始终要记住,沿着路线的任何地方,一些eventHandling代码可以处理事件(如果进一步向下:在您的处理程序有机会之前),将其标记为已处理,并且您的处理程序将不会被调用。

所以,最有可能的是,Slider控件有一个MouseLeftButtonDown的处理程序来设置eventArgs.Handled = true;

但是你可以为此做好准备:使用UIElement方法。AddHandler(routedEvent, handler, handledEventsToo),要么在代码后面调用它,并在那里连接事件和eventandler,要么编写自己的触发器(如<MouseLeftButtonDownEventTrigger HandledEventsToo="true">),标记为HandledEventsToo

后台代码

mySlider.AddHandler(UIElement.MouseLeftButtonDownEvent,
    new MouseButtonEventHandler( HandleMouseLeftButtonDown ), handledEventsToo: true);
...
private void HandleMouseLeftButtonDown( object sender, MouseButtonEventArgs e ){...}

自定义触发器

public class MouseLeftButtonDownEventTrigger : TriggerBase<UIElement>
{
    public bool HandledEventsToo { get; set; }
    public bool MarkHandled { get; set; }
    private readonly MouseButtonEventHandler m_buttonDownHandler;
    public MouseLeftButtonDownEventTrigger()
    {
        m_buttonDownHandler = Invoke;
    }
    private void Invoke( object sender, MouseButtonEventArgs eventArgs )
    {
        InvokeActions( null );
        if (MarkHandled) eventArgs.Handled = true;
    }
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.AddHandler( UIElement.MouseLeftButtonDownEvent,
            m_buttonDownHandler, HandledEventsToo );
    }
    protected override void OnDetaching()
    {
        AssociatedObject.RemoveHandler( UIElement.MouseLeftButtonDownEvent,
            m_buttonDownHandler );
        base.OnDetaching();
    }
}

相关文章:
  • 没有找到相关文章