Silverlight滑块控件不会触发mouseleftbuttondown事件

时间:2015-10-05 11:53:26

标签: c# xaml silverlight

我有一个如下滑块:

<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中检查了命令名称。一切都很正常,但不起作用。我真的坚持这个。我的代码有问题还是关于滑块控制的问题?

1 个答案:

答案 0 :(得分:1)

你的代码也没有什么问题,这也不是Slider的问题,但在处理RoutedEvents时,你总是要记住路线上的任何地方,一些eventHandling代码可以处理事件(如果在树的下方:在你的处理程序有机会之前),将其标记为已处理,并且不会调用你的处理程序。

因此,最有可能的是,Slider控件有MouseLeftButtonDown的处理程序,用于设置eventArgs.Handled = true;

但你可以为此做好准备:使用方法UIElement.AddHandler( routedEvent, handler, handledEventsToo), 要么在代码隐藏中调用它,要么在那里连接事件和eventHandler,要么使用标记<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();
    }
}