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中的命令名称。一切正常,但它不工作。我真的很喜欢这个。是我的代码有问题,还是关于滑块控制的问题?
您的代码也没有任何真正的错误,也不是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();
}
}