我在我的WPF应用程序中使用RX跟踪鼠标移动。
当直接订阅鼠标移动事件时,与使用RX示例方法时,在我的MouseEventArgs中会得到不同的来源。
为了说明,这里有一个简单的例子:
我有一个包含网格和按钮的窗口:
<Window x:Class="WpfApplication4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication4"
Title="MainWindow" Height="350" Width="525">
<Grid x:Name="grid">
<Button></Button>
</Grid>
</Window>
我使用RX订阅了鼠标移动事件:
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Observable.FromEventPattern<MouseEventArgs>(grid, "MouseMove").Subscribe(mouseMoveRx);
Observable.FromEventPattern<MouseEventArgs>(grid, "MouseMove").Sample(TimeSpan.FromSeconds(1)).Subscribe(mouseMoveRxSample);
}
private void mouseMoveRx(System.Reactive.EventPattern<MouseEventArgs> obj)
{
var element = obj.EventArgs.Source as UIElement;
//element is System.Windows.Controls.Button
}
private void mouseMoveRxSample(System.Reactive.EventPattern<MouseEventArgs> obj)
{
var element = obj.EventArgs.Source as UIElement;
//element is Microsoft.Windows.Themes.ButtonChrome
}
第一个处理程序的源是
System.Windows.Controls.Button
,而第二个处理程序的源是 Microsoft.Windows.Themes.ButtonChrome
。两者源不同的原因是什么?
Grid
上的MouseMove
事件,因此占据屏幕空间的任何Grid
中的元素都有可能成为事件源。 - Timothy ShieldsDo
:FromEventPattern(...).Do(mouseMoveRxSampleDo).Sample(...).Subscribe(...);
看看是否我们还会遇到同样的问题。这听起来像是EventArgs
是可变的,并且在Sample
缓存它并报告给观察者之前被某些东西修改了。同时请记住,Sample
会将您从 Dispatcher 线程跳转到线程池线程,这可能会引起某些混乱(虽然不应该导致此特定问题)。 - Brandon