2015-06-13 10 views
1

Я сделал событие для сетки в WPF C#.Событие «Пока кнопка нажата»

MouseMove Событие.

Я хочу Trigger MouseMove события Когда Левая кнопка мыши прессованных и Keep событие, даже если мышь находится в нерабочем состоянии сетки или даже из главного окна.

Когда кнопка является прессованнойДержите в MouseMove события для сетки Все по экрану До кнопка Releasd.

считает это методы события перемещения мыши для сетки

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 модели Когда пользователь Удерживая левую кнопку и вращать модель, пока он не двигается мышь, пока кнопка выпусков.

Это для того, чтобы сделать Программу и Вращение Eaasier для пользователя. Особенно длительное вращение вызывает выведение мыши из сетки.

Я попытался использовать while, но он терпит неудачу, и вы знаете его из-за одиночной резьбы.

так, чтобы думать о том, чтобы каким-то образом расширить новую сетку по всему экрану, когда кнопка нажата внутри исходной сетки и сохранить ее до освобождения.

И, конечно, Dummy Grid witch is Hidden.

+0

спасибо за пуская внимание! Люди задают вопрос 20 просмотров. Я задаю вопросы 6. @AntonSizikov –

+1

http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title –

+0

спасибо за ссылку. я думаю, мне нужно научиться писать хорошее название :), но я попытался ОБЪЯСНАТЬ ПРОБЛЕМУ КАК ЛУЧШЕ, ЧТО Я МОГУ! @AntonSizikov –

ответ

1

Что вы пытаетесь сделать, это работать с потоком событий. Насколько я понимаю, ваш поток должен быть следующим:

кнопка
  1. Левая кнопка мыши нажата
  2. Mouse moved1 (повернуть модель)
  3. Mouse moved2 (повернуть модель)

    ...

    Н. Левая мыши вверх (остановка вращения)

Существует интересная концепция, которая называется 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, так что вы не зависите от сетки, и вы не должны делать поддельные сетки!

Некоторые хорошие ссылки, чтобы начать с:

  1. The Rx Framework by example
  2. Rx. Introduction
+0

wow. для многих новых вещей, которых я никогда не видел. я просто знаю 'GetPosition' !! Я должен начать изучать ваш код. Благодарю. Я надеюсь, что смогу получить хороший результат после анализа и понимания вашего кода. –

+1

Если концепция для вас новая, я рекомендую взглянуть на эту статью http://www.codeproject.com/Articles/52308/The-Rx-Framework-By-Example –

+0

благодарит за работу. (несколько раз минимальная оптимизация сложнее, чем сама запись программы!) –

Смежные вопросы