2008-10-02 32 views
14

我想這XAML:WPF:滑塊犯規提高的MouseLeftButtonDown或的MouseLeftButtonUp

<Slider Width="250" Height="25" Minimum="0" Maximum="1" MouseLeftButtonDown="slider_MouseLeftButtonDown" MouseLeftButtonUp="slider_MouseLeftButtonUp" /> 

而這個C#:

private void slider_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
sliderMouseDown = true; 
} 

private void slider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
sliderMouseDown = false; 
} 

的sliderMouseDown變量不會改變,因爲的MouseLeftButtonDown和的MouseLeftButtonUp事件從未提出。當用戶在滑塊上按下鼠標左鍵以將bool值設置爲true時,如何使此代碼正常工作,並且當鼠標啓動時,bool設置爲false?

回答

14

滑塊吞下鼠標事件(類似於按鈕)。

您可以註冊PreviewMouseDown和PreviewMouseUp事件,在滑塊有機會處理它們之前觸發它們。

+0

謝謝,我能夠將IsMouseCapturedWithinChanged事件與PreviewMouseLeftButtonUp事件結合使用來實現我的最終目標。 – Nick 2008-10-02 05:51:32

+0

有沒有人知道這種行爲的基本原理? – PeterAllenWebb 2008-11-03 18:47:42

16

另一種方式來做到這一點(也可能是更好的根據您的方案)是註冊在程序代碼的事件處理程序如下所示:

this.AddHandler 
(
    Slider.MouseLeftButtonDownEvent, 
    new MouseButtonEventHandler(slider_MouseLeftButtonDown), 
    true 
); 

請注意,真正的爭論。 它基本上說,即使它已被標記爲已處理,您仍希望收到該事件。不幸的是,像這樣連接一個事件處理程序只能通過程序代碼完成,而不能通過xaml完成。

換句話說,使用此方法,您可以註冊普通事件(哪些氣泡)的事件處理程序,而不是隧道(因此發生在不同時間)的預覽事件。

查看WPUR Unleashed的更多信息,請參閱第70頁的挖掘更深入的邊欄。

1

我想提一下,Slider並不完全吞下整個MouseDown事件。通過點擊刻度標記,您可以得到有關事件的通知。滑塊不會處理MouseDown事件,除非它們來自滑塊的...滑塊。

基本上,如果你決定使用

AddHandler(Slider.MouseLeftButtonDownEvent, ..., true) 

版本與蜱開啓,確保該事件之前處理。如果你不這樣做,最終會出現一個你認爲滑塊被點擊的邊緣情況,但它確實是一個嘀嗒。註冊預覽事件更糟糕 - 您可以在任何地方選擇事件,即使在蜱之間的空白處也是如此。

4

嘗試使用LostMouseCapture和GotMouseCapture。

private void sliderr_LostMouseCapture(object sender, MouseEventArgs e) 

    private void slider_GotMouseCapture(object sender, MouseEventArgs e) 

GotMouseCapture在用戶開始拖動滑塊時觸發,LostMouseCapture在釋放時觸發。