2015-10-05 77 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