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