2013-01-31 2 views
2

RX가 처음인데도 문제를 해결할 수있는 좋은 솔루션을 제공 할 수 있어야한다고 생각합니다. 꽤 많은 검색을 한 후에도 여전히 해결책을 찾지 못했습니다.RX를 사용하여 마우스 이동 이벤트의 빈도를 줄일 수 있습니다.

컨트롤이 일부 마우스 이동 이벤트에 대한 응답으로 작동하는 WPF 응용 프로그램이 있습니다. 이벤트의 빈도를 줄이기 위해 핸들러가 현재보다 덜 자주 호출되도록합니다 (사용자가 마우스를 컨트롤 위로 이동시킬 때). 이상적으로 내가 원하는 것은 관찰자를 설정하고 구독하는 것입니다. 관찰자는 마우스 이동 이벤트를 관찰하고 특정 시간 창 (예 : 0.2 초)이 경과 한 후 최신 이벤트 및 인수를 사용하여 클라이언트 코드를 호출해야합니다. 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

마우스 다운 이벤트 핸들러에서 충돌이 발생했습니다. 마우스 이동시 샘플 호출을 사용할 때만 발생합니다. –

+0

아, 스레딩 문제처럼 보입니다. BeginInvoke를 할 필요가 있습니다 –

관련 문제