2015-10-05 94 views
0

我有一个滑块象下面这样:的Silverlight滑块控件不会触发MouseLeftButtonDown事件

<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

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

所以,最有可能的,滑块控制有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(); 
    } 
} 
+0

谢谢您的回答。我决定在代码隐藏中使用MouseLeftButtonDown事件。我在这个事件中使用'(LayoutRoot.DataContext as Model).Method();'调用函数。 – Blast