我在WPF C#中为Grid制作了事件。
MouseMove 事件。
我想触发 MouseMove 事件当鼠标左键是按下并且保持事件时,即使鼠标不在网格状态或者甚至是主窗口。
按钮按下 保持网格的 Mousemove 事件全屏幕直到按钮 Releasd
考虑这是Grid的鼠标移动事件方法
private void Grid_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed) // Only When Left button is Pressed.
{
// Perform operations And Keep it Until mouse Button is Released.
}
}
目标是旋转3D模型当用户按住左键并在移动鼠标时旋转模型直到按钮释放。
这是为了让用户使程序和循环更加容易。特别是执行长旋转会导致鼠标离开网格。
我尝试使用while
但它失败了,你知道它是因为单线程。
因此我想的方式是在原始网格中按下按钮时以某种方式在整个屏幕上展开新的网格并保持它直到发布。
当然Dummy Grid女巫是隐藏的。
答案 0 :(得分:1)
您要做的是处理事件流。据我所知,您的流量应该如下:
鼠标已移动2(旋转模型)
...
<磷>氮。向左鼠标(停止旋转)有一个有趣的概念叫做Reactive Programming。 http://rxwiki.wikidot.com/101samples
有一个C#(Reactive-Extensions)
的库您的代码可能如下所示:
// create event streams for mouse down/up/move using reflection
var mouseDown = from evt in Observable.FromEvent<MouseButtonEventArgs>(image, "MouseDown")
select evt.EventArgs.GetPosition(this);
var mouseUp = from evt in Observable.FromEvent<MouseButtonEventArgs>(image, "MouseUp")
select evt.EventArgs.GetPosition(this);
var mouseMove = from evt in Observable.FromEvent<MouseEventArgs>(image, "MouseMove")
select evt.EventArgs.GetPosition(this);
// between mouse down and mouse up events
// keep taking pairs of mouse move events and return the change in X, Y positions
// from one mouse move event to the next as a new stream
var q = from start in mouseDown
from pos in mouseMove.StartWith(start).TakeUntil(mouseUp)
.Let(mm => mm.Zip(mm.Skip(1), (prev, cur) =>
new { X = cur.X - prev.X, Y = cur.Y - prev.Y }))
select pos;
// subscribe to the stream of position changes and modify the Canvas.Left and Canvas.Top
// property of the image to achieve drag and drop effect!
q.ObserveOnDispatcher().Subscribe(value =>
{
//rotate your model here. The new mouse coordinates
//are stored in value object
RotateModel(value.X, value.Y);
});
实际上构建鼠标事件流是使用RX的一个非常经典的例子。
http://theburningmonk.com/2010/02/linq-over-events-playing-with-the-rx-framework/
您可以在Windows构造函数中订阅此事件流,因此您不必依赖网格,也不必绘制假网格!
以开头的一些不错的链接: