在我的WPF应用程序中,我有一个在我的UI元素的MouseEnter事件上调用的事件处理程序:
myUiElement.MouseEnter += myEventHandler
Run Code Online (Sandbox Code Playgroud)
我想限制myEventHandler,所以它不会每秒被调用多次.我怎样才能做到这一点?Rx是最好的方法吗?如果它有所作为,我正在使用.NET 4.0.
此外,我需要确保在下一个MouseEnter事件之前始终调用MouseLeave事件; 我需要自己管理吗?或者框架是否已经设计好,以便在下一个MouseEnter事件之前始终调用MouseLeave事件?如果我在这些事件处理程序中有异步代码怎么办?
您可以使用反应式扩展,但您可以使用计时器轻松完成此操作.
设置一个标志和一个Timer.当计时器tick事件触发时,将标志设置为false,禁用计时器,并运行事件的代码.然后,在控件事件处理程序中,如果设置了标志,则跳过处理程序代码.
bool flag;
DispatcherTimer timer;
public constructor()
{
timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += (s,e) => {
flag = false;
timer.Stop()
DoThrottledEvent();
}
}
void mouse_enter(object sender, MouseEventArgs args)
{
if(!flag)
{
flag = true;
timer.Start();
}
}
void DoThrottledEvent()
{
//code for event here
}
Run Code Online (Sandbox Code Playgroud)
反应性扩展引入了额外的依赖,但它们有点有趣.如果你有兴趣,那就去吧!
使用Rx,您希望使用Sample方法或Throttle.
这样的东西应该工作(未经测试):
Observable
.FromEventPattern<TextChangedEventArgs>(myUiElement, "MouseEnter");
.Sample(TimeSpan.FromSeconds(1));
.Subscribe(x=>...Do Stuff Here...);
Run Code Online (Sandbox Code Playgroud)
Sample和Throttle之间的区别在于,无论何时采用最后一个值,Sample都将每1秒获取一个值,而Throttle将获取一个值,然后等待另一个1秒再取出另一个值.
这可能取决于你拍摄的是什么......
归档时间: |
|
查看次数: |
4973 次 |
最近记录: |