2010-08-17 54 views
2

我希望能夠在不觸發事件處理程序的情況下修改代碼中的某個觸控欄的value屬性。只有當用戶通過拖動滑塊或用鍵盤移動滑塊來改變控件時,才希望觸發事件。實現這個最簡單的方法是什麼?觸發器ValueChanged上的觸發事件,但沒有在代碼中

我有6個軌道條,我想根據哪個軌跡條被改變來改變其中3個的值。問題是,改變這些軌跡條的值將觸發它們的ValueChanged事件。

回答

1

可以這樣做的一種方法是在修改代碼中的值之前臨時刪除事件處理程序,然後重新附加它們,雖然這看起來不太優雅。

或者,您可以創建自己的自定義TrackBar類,該類繼承自TrackBar並重寫OnValueChanged()方法以執行所需操作。

如果你這樣做了,我能想到的一個想法是在更改值之前設置一個SuspendChangedEvents屬性,然後重置它,這將提供與'remove/attach'處理技術類似的功能,但邏輯被封裝在TrackBar內部。

public class MyTrackBar : TrackBar 
{ 
    public bool SuspendChangedEvent 
    { get; set; } 

    protected override void OnValueChanged(EventArgs e) 
    { 
     if (!SuspendChangedEvent) base.OnValueChanged(e); 
    } 
} 

然後在你的代碼中,你可以做這樣的事情。

// Suspend trackbar change events 
myTrackBar1.SuspendChangedEvents = true; 

// Change the value 
myTrackBar1.Value = 50; // ValueChanged event will not fire. 

// Turn changed events back on 
myTrackBar1.SuspendChangedEvents = false; 
3

您可以使用滾動事件的ValueChanged代替,這個事件當用戶拖動滑塊或使用該鍵來移動它的價值只有被炒魷魚,你從代碼所做的更改不會開火吧。

+1

我認爲這是正確的答案。謝謝! – anion 2017-01-23 13:44:50