gpt4 book ai didi

c# - 使用 Reactive Extensions 创建可观察到的鼠标拖动

转载 作者:太空宇宙 更新时间:2023-11-03 20:40:57 25 4
gpt4 key购买 nike

我有以下内容

var leftMouseDown = Observable.FromEvent<MouseButtonEventArgs>(displayCanvas, "MouseLeftButtonDown");
var leftMouseUp = Observable.FromEvent<MouseButtonEventArgs>(displayCanvas, "MouseLeftButtonUp");
var mouseMove = Observable.FromEvent<MouseEventArgs>(displayCanvas, "MouseMove");

var leftMouseDragging = from down in leftMouseDown
let startPoint = down.EventArgs.GetPosition(displayCanvas)
from move in mouseMove.TakeUntil(leftMouseUp)
let endPoint = move.EventArgs.GetPosition(displayCanvas)
select new { Start = startPoint, End = endPoint };

当我订阅它时,它会给我拖动的起点和当前终点。现在我需要在拖动完成后做一些事情。我试图用 RX 完全做到这一点并没有成功,最终做了

leftMouseDragging.Subscribe(value=>
{
dragging = true;
//Some other code
});

leftMouseUp.Subscribe(e=>
{
if(dragging)
{
MessageBox.Show("Just finished dragging");
dragging = false;
}
});

在我进行鼠标右键拖动之前,这一切正常。然后,当我单击鼠标左键时,会出现消息框。如果我只进行左键拖动,我会得到消息框,然后单击鼠标左键不会产生消息框。我想在没有外部状态的情况下执行此操作,但如果没有别的,我至少希望它能够正常工作。

仅供引用:我尝试将拖动设置为 volatile 并使用锁,但这没有用。

编辑

原来我的问题是右键单击上下文菜单。一旦我摆脱了我上面的代码工作。所以,现在我的问题是如何获得上下文菜单并仍然让我的代码正常工作。我假设上下文菜单正在处理鼠标左键单击,并且不知何故导致我的代码无法运行,但我仍然感到困惑。

最佳答案

如果您只需要拖动,那么一个简单的 .Zip 文件行不通? :

var drag = _mouseDown
.Select(args => args.EventArgs.GetPosition(canvas))
.Zip(_mouseUp.Select(args => args.EventArgs.GetPosition(canvas)),
(p1, p2) => new { p1, p2 });
drag.Subscribe(p1p2 =>
Console.WriteLine(@"({0}:{1})({2}:{3})",
p1p2.p1.X, p1p2.p1.Y, p1p2.p2.X, p1p2.p2.Y));

如果您需要排除零长度拖动,您可以应用 Where 过滤器。

编辑:尽管如此,Zip 很容易在窗口外释放鼠标 - 在这种情况下,除非捕获...这是在 mouseUp 之前仅使用最新的 mouseDown 的版本:

var drag = _mouseDown
.Select(args => args.EventArgs.GetPosition(canvas))
.TakeUntil(_mouseUp)
.CombineLatest(_mouseUp
.Select(args => args.EventArgs.GetPosition(canvas))
.Take(1), (p1, p2) => new { p1, p2 })
.Repeat();

关于c# - 使用 Reactive Extensions 创建可观察到的鼠标拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2699956/

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