首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的事件串扰:鼠标和键盘,WPF和Rx?

奇怪的事件串扰:鼠标和键盘,WPF和Rx?
EN

Stack Overflow用户
提问于 2010-11-26 23:31:25
回答 1查看 507关注 0票数 0

我在VS 2010中编写了一个非常小的WPF + Rx程序,它有一些意想不到的行为--似乎在鼠标事件可观察到的事件中获取alt键事件。如果你能给我建议,我将不胜感激

  1. 的想法或工具有什么特别的错误,如何自己进一步诊断?例如,是否有一些工具可以对代码进行检测,以跟踪和记录所有被触发的事件,以便我能更清楚地看到发生了什么?
  2. 如何理解这种行为--这是“通过设计”吗?我是在滥用WPF或Rx,还是两者兼而有之?
  3. 如何获得我想要的行为,如下所示:

首先,它正确地做的是用鼠标移动观察者,从鼠标向下开始,以鼠标向上结束。我刚刚看到的特定测试观察者将正确的mouseDown + mouseUp坐标放置在窗口的TitleBar中(参见下面的代码+ XAML )。

当鼠标关闭时,如果我按下并释放alt键,就会产生奇怪的感觉。这似乎立即停止了mouseMove事件观察者。现在,如果我发布mouseButton,则mouseMove事件观察者将再次启动,并继续运行,直到生成新的mouseDown或再次按下并释放alt。此外,如果我遍历这个序列,即

代码语言:javascript
复制
mouseDown
mouseMove
alt-key down
alt-key up
mouseUp
alt-key down
alt-key up

然后,正常人

代码语言:javascript
复制
mouseDown
mouseMove

标题栏中的指纹有一些奇怪的闪现,告诉我还有其他的,无关的事件被跟踪,并通过我的观察者兰巴。

除了alt之外,我还没能让这件事失败,这加深了这个谜团。

想要的行为可能是

  1. 要么在鼠标移动处理程序
  2. 中显式检查alt键状态,要么为keyDown和keyUp事件检查单独的事件流,然后在代码

中找出交织。

但是,可以肯定的是,有这种行为,更糟糕的是,不知道如何理解它,真的很糟糕。任何想法我都会感激的!

(注意:添加对System.coreex、System.Reactive和System.Interactive的引用)

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

发布于 2010-11-27 21:58:18

您的应用程序有主菜单吗?按alt键使菜单栏聚焦,然后再按alt键将焦点返回给以前有焦点的地方。这将解释您所看到的功能。(看起来不像Rx问题)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4289209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档