2013-01-31 22 views
2

我是RX新手,但覺得它應該能夠爲我希望解決的任務提供一個很好的解決方案。經過相當多的搜索後,我仍然沒有找到解決方案。使用RX減少鼠標移動事件的頻率

我有一個WPF應用程序,其中一個控件在響應某些鼠標移動事件時做了一些工作。我想要減少事件發生的頻率,以便處理程序被調用的次數比當前情況少(當用戶在控件上移動鼠標時)。理想情況下,我想要設置和訂閱觀察員。觀察者應觀察鼠標移動事件,並在特定時間窗口過去後調用客戶端代碼和最近的事件和參數,例如0.2s。作爲新RX,我第一次取代了我原來的標準事件掛鉤以觀察員如下:

var mouseMove = Observable.FromEventPattern<MouseEventArgs>(myControl, "MouseMove"); 

mouseMove.Subscribe(args => myControl_MouseMove(args.Sender, args.EventArgs)); 

這似乎很好地工作。

然後我試圖修改觀察者以獲得我上面描述的行爲。我嘗試使用Throttle()調用和Sample()調用。這些沒有產生我預期的結果(或願望)。事實上,在某些情況下,使用Throttle/TimeSpan調用的特定超載會導致我的應用程序死機,但我仍不明白。

這是什麼,我已經試過一個例子:

var mouseMove = Observable.FromEventPattern<MouseEventArgs>(myControl, "MouseMove").Throttle(TimeSpan.FromSeconds(0.2)); 

mouseMove.Subscribe(args => myControl_MouseMove(args.Sender, args.EventArgs)); 

從閱讀,油門,直到出現的頻率低於特定閾值(不完全是我預期)吞下的事件,而我相信樣品每隔一段時間對觀察到的事件進行採樣?我希望客戶代碼在給定的時間間隔內被賦予最近的事件。如果在該時間間隔內沒有記錄任何事件,則不應調用客戶端。

希望有人可以幫助這個RX新手。

噢,我也希望隨時瞭解控件使用期限內(降低頻率)的鼠標移動情況。

最大

回答

4

我認爲你是正確的軌道上Sample - 什麼,具體而言,沒有這不是你做的?

例LINQPad片段:

void Main() 
{ 
    var window = new Window(); 
    window.Content = ctrl; 
    window.Show(); 
    var mouseMove = Observable 
     .FromEventPattern<MouseEventArgs>(window, "MouseMove") 
     .Sample(TimeSpan.FromSeconds(0.2)); 
    var disp = mouseMove.Subscribe(args => myControl_MouseMove(args.Sender, args.EventArgs));  
    window.Closed += (o,e) => disp.Dispose(); 
} 

ItemsControl ctrl = new ItemsControl(); 

// Define other methods and classes here 
private void myControl_MouseMove(object sender, MouseEventArgs args) 
{ 
    ctrl.Dispatcher.BeginInvoke((Action)(() => {ctrl.Items.Add(args.GetPosition(ctrl));})); 
} 
+0

它有點工作,但我現在經常看到,殺我的應用程序異常:類型的第一個機會異常「System.InvalidOperationException」發生在System.Reactive.Core.dll –

+0

崩潰發生在鼠標放下事件處理程序中。只有在鼠標移動時使用Sample調用時纔會發生。 –

+0

啊,看起來像是一個線程問題。我需要做BeginInvoke –