我在VS 2010中编写了一个非常小的WPF + Rx程序,它有一些意想不到的行为--似乎在鼠标事件可观察到的事件中获取alt键事件。如果你能给我建议,我将不胜感激
首先,它正确地做的是用鼠标移动观察者,从鼠标向下开始,以鼠标向上结束。我刚刚看到的特定测试观察者将正确的mouseDown + mouseUp坐标放置在窗口的TitleBar中(参见下面的代码+ XAML )。
当鼠标关闭时,如果我按下并释放alt键,就会产生奇怪的感觉。这似乎立即停止了mouseMove事件观察者。现在,如果我发布mouseButton,则mouseMove事件观察者将再次启动,并继续运行,直到生成新的mouseDown或再次按下并释放alt。此外,如果我遍历这个序列,即
mouseDown
mouseMove
alt-key down
alt-key up
mouseUp
alt-key down
alt-key up然后,正常人
mouseDown
mouseMove标题栏中的指纹有一些奇怪的闪现,告诉我还有其他的,无关的事件被跟踪,并通过我的观察者兰巴。
除了alt之外,我还没能让这件事失败,这加深了这个谜团。
想要的行为可能是
中找出交织。
但是,可以肯定的是,有这种行为,更糟糕的是,不知道如何理解它,真的很糟糕。任何想法我都会感激的!
(注意:添加对System.coreex、System.Reactive和System.Interactive的引用)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Input;
namespace DownAndMoveTest
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
(from mDown in this.GetLeftMouseDownObservable().
Do(e => this.Title = "DOWN: " + e.EventArgs.GetPosition(this).ToString())
let mDownP = mDown.EventArgs.GetPosition(this)
from mMove in this.GetMouseMoveObservable().TakeUntil(this.GetLeftMouseUpObservable())
select new
{
D = mDownP,
M = mMove.EventArgs.GetPosition(this)
}).Subscribe(ps =>
{
this.Title = String.Format(
"Window MouseDown({0:G}, {1:G}), MouseMove({2:G}, {3:G})",
ps.D.X, ps.D.Y,
ps.M.X, ps.M.Y);
});
}
}
public static partial class UIElementExtensions
{
public static IObservable<IEvent<MouseButtonEventArgs>>
GetLeftMouseDownObservable(this UIElement uiElement)
{
return Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>(
h => new MouseButtonEventHandler(h),
h => uiElement.MouseLeftButtonDown += h,
h => uiElement.MouseLeftButtonDown -= h);
}
public static IObservable<IEvent<MouseEventArgs>>
GetMouseMoveObservable(this UIElement uiElement)
{
return Observable.FromEvent<MouseEventHandler, MouseEventArgs>(
h => new MouseEventHandler(h),
h => uiElement.MouseMove += h,
h => uiElement.MouseMove -= h);
}
public static IObservable<IEvent<MouseButtonEventArgs>>
GetLeftMouseUpObservable(this UIElement uiElement)
{
return Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>(
h => new MouseButtonEventHandler(h),
h => uiElement.MouseLeftButtonUp += h,
h => uiElement.MouseLeftButtonUp -= h);
}
}
}及其XAML
<Window x:Class="DownAndMoveTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
</Grid>
</Window>发布于 2010-11-27 21:58:18
您的应用程序有主菜单吗?按alt键使菜单栏聚焦,然后再按alt键将焦点返回给以前有焦点的地方。这将解释您所看到的功能。(看起来不像Rx问题)
https://stackoverflow.com/questions/4289209
复制相似问题