gpt4 book ai didi

wpf - Reactive Extensions (Rx) - 仅在按住某个键时订阅鼠标位置数据

转载 作者:行者123 更新时间:2023-12-04 10:21:59 25 4
gpt4 key购买 nike

在 WPF 中,我只想在按住某个键时订阅鼠标位置点。然后我想将捕获的点设置到属性上,仅当释放键时(即当我有完整的捕获点集时)并继续监听下一个键的向下/向上组合以创建另一个鼠标位置捕获,等

我对上面的解释是,我需要在按下一个键时触发一个序列,并在释放一个键时停止拍摄,但我希望 OnNext 接收一组鼠标点。

通过大量阅读(我是 Rx 的新手),我整理了以下伪/真实示例:

var keyDownSeq = Observable.FromEvent(...);
var keyUpSeq = Observable.FromEvent(...);
var mouseMoveSeq = Observable.FromEvent(...);

var mouseMovesWhileKeyDown = keyDownSeq
.Where(keyEventArgs => keyEventArgs.IsRepeat == false) //WPF fires the same KeyDown repeatedly
.Where(keyEventArgs => keyEventArgs.Key == Key.Space)
.Select(_ => mouseMoveSeq
.TakeUntil(keyUpSeq)
.ToList())
.Subscribe(listOfMousePoints => MyProperty = listOfMousePoints);
  1. 上面的代码会按照我的想法创建一个按住空格键时遇到的鼠标点列表吗?我需要在哪里调用 ToList(),还是应该在订阅中调用?

  2. 如果我删除第二个 Where 子句(允许按下任何键开始捕获),我如何才能防止按下第二个或第三个键并导致结果序列重复?

谢谢。

编辑

使用局部变量执行以下操作是否完全不正确?

  • 将局部变量设置为 Select() 中的 KeyDown 序列值
  • 当 KeyUpSeq 遇到相同的键时,将局部变量重置为 null
  • 过滤 KeyDownSeq 以在该变量具有值时忽略所有值
  • 过滤 KeyUpSeq 以忽略所有与局部变量不匹配的 KeyUp 值

Rx有没有这种局部状态变量的概念?

最佳答案

我看到有两种方法可以简化您的设置。第一个是创建单个 IObservable<bool>恰好在您的按键在向下或向上位置之间切换时发出。

//true means key down, false means key up
IObservable<bool> keyChange =
Observable.Merge(
Observable.FromEvent(/*keyDown*/).Select(_ => true),
Observable.FromEvent(/*keyUp*/).Select(_ => false))
.DistinctUntilChanged();

这就是历史的样子,其中 x是一个事件触发,一个 TF是一个 bool 值,从左到右是递增的时间。

keyDown    -----xxxxxxxx--------xxxxxxx------xxxxxxxxxxxxx----
keyUp xxxxx--------xxxxxxxx-------xxxxxx-------------xxxx
keyChange F----T-------F-------T------F-----T------------F---

第二种是使用Observable.Window在按键“打开窗口”和按键“窗口关闭”之间拉出连续的鼠标移动序列。

IObservable<Point> mouseMoves = Observable.FromEvent(...);

IObservable<IObservable<Point>> mousePaths = mouseMoves.Window(
keyChange.Where(b => b),
_ => keyChange.Where(b => !b));

所用方法的文档:

Window 的签名一开始可能有点吓人,但一旦您理解了它,使用起来就相当简单。

关于wpf - Reactive Extensions (Rx) - 仅在按住某个键时订阅鼠标位置数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21886674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com