c# - Event "While Button is Pressed" -
i made event grid in wpf c#.
the mousemove event.
i want trigger mousemove event when mouse left button pressed , keep event when mouse out of grid or out of main window.
when button pressed keep mousemove event grid all on screen until button releasd.
consider mouse move event method grid
private void grid_mousemove(object sender, mouseeventargs e) { if (e.leftbutton == mousebuttonstate.pressed) // when left button pressed. { // perform operations , keep until mouse button released. } }
the goal rotate 3d model when user hold left button , rotate model while moving mouse until button releases.
this make program , rotation eeasier user. especialy performing long rotations cause mouse out of grid.
i tried use while
fails , know because of single threaded.
so way im thinking somehow expand new grid on screen when button pressed inside original grid , keep until release.
and of course dummy grid witch hidden.
what trying work stream of events. far understand flow supposed following:
- left mouse button pressed
- mouse moved1 (rotate model)
mouse moved2 (rotate model)
...
n. left mouse (stop rotation)
there interesting concept called reactive programming. http://rxwiki.wikidot.com/101samples
there library c# (reactive-extensions)
your code one:
// create event streams mouse down/up/move using reflection var mousedown = evt in observable.fromevent<mousebuttoneventargs>(image, "mousedown") select evt.eventargs.getposition(this); var mouseup = evt in observable.fromevent<mousebuttoneventargs>(image, "mouseup") select evt.eventargs.getposition(this); var mousemove = evt in observable.fromevent<mouseeventargs>(image, "mousemove") select evt.eventargs.getposition(this); // between mouse down , mouse events // keep taking pairs of mouse move events , return change in x, y positions // 1 mouse move event next new stream var q = start in mousedown 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 stream of position changes , modify canvas.left , canvas.top // property of image achieve drag , drop effect! q.observeondispatcher().subscribe(value => { //rotate model here. new mouse coordinates //are stored in value object rotatemodel(value.x, value.y); });
actually building stream of mouse events classical example of using rx.
http://theburningmonk.com/2010/02/linq-over-events-playing-with-the-rx-framework/
you can subscribe on stream of events in windows constructor, don't depend on grid, , don't have draw fake grid!
some nice links start with:
Comments
Post a Comment