2010-11-21 4 views
2

WPF, Shapesразница между MouseClick и DoubleClick

У меня есть обычай Shape и попытаться реализовать MouseClick и MouseDoubleClick вещи на нем.

Напр. Мне нужно Открыть информационное окно о MyShape OnClick и выберите it OnDoubleClick.

Заглушка является следующее:

public class MyShape : Shape 
{ 
    public Point Point1, Point2; 

    public MyShape() : base() { } 

    protected override Geometry DefiningGeometry 
    { 
     get { return new LineGeometry(Point1, Point2); } 
    } 

    protected override void OnMouseUp(MouseButtonEventArgs e) 
    { 
     base.OnMouseUp(e); 
     if (e.ClickCount == 1) 
     { 
      // Open Informational Window 
     } 
     else if (e.ClickCount == 2) 
     { 
      // Select Item 
     } 
    } 
} 

Каждый раз, когда я дважды щелкните как // Only do MouseClick и // Only do MouseDoubleClick происходит.

Есть ли способ избежать этого в WPF, .NET 4?

+0

You» re пытается создать очень противоречивое и неожиданное поведение. ** Не **. – SLaks

+0

@SLaks: обсудите с нашими клиентами. – serhio

+0

Вы должны выбрать фигуры на _single_ -click, а затем отобразить свойства с двойным щелчком. – SLaks

ответ

2

Между первого щелчка и второй клик в двойной клик я думаю, что это время около 50 и 400 мс, Таким образом, ниже код не является лучшим вариантом, но сделать трюк:

bool firstClicked = false; 

    protected override void OnMouseUp(MouseButtonEventArgs e) 
    { 
     base.OnMouseUp(e); 
     if (e.ClickCount == 1) 
     { 
      firstClicked = true; 
      Task tsk = new TaskFactory() 
          .StartNew(
          () => 
           { 
            Thread.Sleep(SystemInformation.DoubleClickTime); 
            if (firstClicked) 
            { 
             // if you want to use `e` 
             // e.Source 
             // Open Informational Window 
            } 
             firstClicked = false; 
            } 
             ); 

           } 

     } 
     else if (e.ClickCount == 2) 
     { 
      firstClicked = false; 
      // Select Item 
     } 
    } 
+2

замените 400 => 'SystemInformation.DoubleClickTime' – serhio

+0

@serhio, да, я не знал об этом. –

+0

http://stackoverflow.com/questions/4246945/volatilewrite-booleans – serhio

0

Каждый DoubleClick начинается с щелчка.

+0

Мне нужно выбрать MyShape OnClick и открыть информационное окно w на DoubleClick. – serhio

+1

Вы не можете сказать разницу между ними, не предсказывая будущее. – SLaks

+0

О, давай ... есть событие MouseDoubleClick для элементов управления, отличное от MouseDown. Когда я выбираю файл в Windows, я делаю это с щелчком мыши и открываю его с помощью DoubleClick – serhio

0

Возможно, попробуйте прилагаемое поведение?

Try this link for an explanation

Может быть, вы можете агрегировать события ... я думаю, что это то, что вы пытаетесь сделать, верно?

+0

Что значит ...? – serhio

+0

Я предполагаю, что вы пытаетесь сделать: a) одним нажатием (и только одним щелчком мыши) выберите элемент. б) в открывшемся информационном окне с двойным щелчком (но не выберите) это неправильно? – miguel

+0

@ Мигуэль, давайте немного усложним. просто откройте окно onClick и просто выберите в DoubleClick. – serhio

1

Как я уже сказал в комментарии, у меня была такая же проблема. Мне нужно было обнаружить двойные клики, но клики и двойные клики должны вести себя как отдельные события. Смысл, если был сделан двойной щелчок, щелкните не следует, чтобы стрелять (потому что каждое действие имело разные и не совместимые эффекты в пользовательском интерфейсе).

«Нативный» двойной щелчок не работал для меня, потому что события клика активировали, произошел ли двойной щелчок или нет. Вот пример кода в ActionScript. Я уверен, что вы сможете следовать (простой) логике для ее реализации в .net. Обратите внимание, что я жестко кодирую время двойного щелчка, поскольку я не мог получить системное значение для него из ActionScript. Это не идеально, но это я компромисс, который я должен был сделать. Вместо этого вы должны использовать промежуток времени, предоставляемый операционной системой (или временем выполнения), если она доступна вам.

Надеюсь, что это поможет.

package { 
    import flash.events.*; 
    import flash.display.*; 
    import flash.utils.*; 

    public class Button extends Sprite { 

     public function DCButton() { 
      super(); 
      graphics.beginFill(0xff0000); 
      graphics.drawRect(0,0,100,100); 
      graphics.endFill(); 
      addEventListener(MouseEvent.CLICK,handleClick); 
     } 

     private var _clickCount:int = 0; 
     private var _doubleClickInterval:int = 200; 

     private function handleClick(e:MouseEvent):void { 
      _clickCount++; 
      // start the timer and when it completes, check the number of clicks 
      // based on this, dispatch either click or doubleClick events 
      if(_clickCount == 1) { 
       setTimeout(checkDoubleClick,_doubleClickInterval,e); 
      } 
      else 
      { 
       checkDoubleClick(e); 
      } 

     } 

     private function checkDoubleClick(e:MouseEvent):void { 

      if(_clickCount == 0) return; 

      var type:String; 

      if(_clickCount == 1) { 
       type="click"; 
      } else if(_clickCount > 1) { 
       type="doubleClick"; 
      } 

      trace(type); 

      _clickCount = 0; 
      // dispatch the detected event here... 

     }   
    } 


}