这里是订阅窗体的LocationChanged的事件。
收到事件后并不是立即执行,而是先等100毫秒,如果持续100毫秒再没有收到新的事件,那就执行响应函数。
IObservable<EventPattern<EventArgs>> move = Observable.FromEventPattern<EventArgs>(this, "LocationChanged");
move.Throttle(TimeSpan.FromMilliseconds(100))
.Subscribe(evt =>
{
this.Dispatcher.BeginInvoke(() =>
{
var rect = AppBase.GetScreenWorkingArea(this);
if (rect.Width != _rect.Width || rect.Height != _rect.Height)
{
AppBase.UpdateWindowPostion(this);
}
_rect = AppBase.GetScreenWorkingArea(this);
});
});
上面使用了this.Dispatcher.BeginInvoke是因为貌似回来的事件是非UI线程的,所以这里切换回UI线程执行。