2012-02-09 19 views
12

Czy zdarzenie wywołane zdarzeniem podwójnego kliknięcia w oknie okna WPF jest uruchamiane?Podwójne kliknięcie zdarzenia na ramce okna WPF

Jak mogę to złapać?

Dzięki!

+1

Może to pomoże - http://stackoverflow.com/questions/3410768/why-doesnt-wpf-border-control-have-a-ououououbleclick-event –

+0

@BaliC Przepraszamy, nie rozumiem, jak mogę zrobić to dla prostego okna WPF? – Terminador

+0

Masz na myśli podwójne kliknięcie na oknie chrome? To samo podwójne kliknięcie, które powoduje zmaksymalizowanie/zminimalizowanie okna? – ppiotrowicz

Odpowiedz

30

Oto jeden sposób .. Wystarczy ustawić Window.WindowStyle na "None" i utworzyć w dół okna border:

<Grid> 
    <Border 
     BorderBrush="Silver" 
     BorderThickness="10" 
     Name="border1" 
     MouseLeftButtonDown="border1_MouseLeftButtonDown" /> 
</Grid> 

W kodzie za:

private void border1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ClickCount == 2) 
     MessageBox.Show("Double Click"); 
} 
+0

Dzięki! Ale mówię o rodzimej granicy okna ... i sugerujesz użycie kontroli granicznej WPF ... – Terminador

+0

Zasugerowałem, że jednym ze sposobów ataku było narysowanie własnej granicy, wtedy miałbyś pełną kontrolę nad wydarzeniami. – RQDQ

+0

Ahhh Więc tak, to może być rozwiązanie. Dziękuję Ci! – Terminador

1
using System.Windows.Input; 
using System.Windows.Threading; 
    namespace System.Windows.Controls{ 
    class DCCanvas : Canvas{ 

     public event MouseButtonEventHandler MouseDoubleClick; 
     private bool doubleClickStarted; 
     private DispatcherTimer doubleClickTimer; 
     private const long DOUBLE_CLICK_INTERVAL = 2000000; 

     public DCCanvas() : base(){  
      doubleClickStarted = false; 
      doubleClickTimer = new DispatcherTimer(); 
      doubleClickTimer.Interval = new TimeSpan(DOUBLE_CLICK_INTERVAL); 
      doubleClickTimer.Tick += new EventHandler(doubleClickTimer_Tick); 
      MouseUp += new MouseButtonEventHandler(mouseUpReaction); 
     } 

     private void mouseUpReaction(object sender, MouseButtonEventArgs e){ 
      if(doubleClickStarted) { 
       doubleClickStarted =false; 
       if(MouseDoubleClick!=null) 
        MouseDoubleClick(sender, e); 
      } 
      else{ 
       doubleClickStarted =true; 
       doubleClickTimer.Start();    
      } 
     } 
     private void doubleClickTimer_Tick(object sender, EventArgs e){ 
      doubleClickStarted = false; doubleClickTimer.Stop(); 
     } 
    } 
} 

Tutaj powyżej to moja klasa Canvas. Możesz go użyć, aby ułatwić obsługę podwójnych kliknięć Twojego płótna. Będzie uruchamiał się przy każdym drugim uruchomieniu myszy w określonym przedziale czasu (const DOUBLE_CLICK_INTERVAL w kodzie). Wydaje mi nie bardzo trudne do wykorzystania:

public partial class MainWindow : Window 
{ 
    DCCanvas rusCanvas1; 

    public MainWindow(){ 
     InitializeComponent(); 

      rusCanvas1 = new DCCanvas(); 
      /* Some code with properties for new rusCanvas */ 
      this.grid1.Children.Add(rusCanvas1); 
      rusCanvas1.MouseDoubleClick += new MouseButtonEventHandler(canvas1_doubleClick); 
    } 
    private void canvas1_doubleClick(object sender, MouseButtonEventArgs e) { 
     MessageBox.Show(sender.ToString()); 
    } 
} 

Jeśli nie chcesz pisać właściwości na płótnie, można dodać konstruktora-copyer do klasy:

public DCCanvas(Canvas source) : base(){ 
     Margin = source.Margin; 
     Style = source.Style; 
     Height = source.Height; 
     Width = source.Width; 
     Background = source.Background; 
     VerticalAlignment = source.VerticalAlignment; 
     HorizontalAlignment = source.HorizontalAlignment; 


     doubleClickStarted = false; 
     doubleClickTimer = new DispatcherTimer(); 
     doubleClickTimer.Interval = new TimeSpan(DOUBLE_CLICK_INTERVAL); 
     doubleClickTimer.Tick += new EventHandler(doubleClickTimer_Tick); 
     MouseUp += new MouseButtonEventHandler(mouseUpReaction); 
    } 

Oky, teraz można tworzyć swoje płótna w edytorze wizualnym, a następnie napisać tak:

  rusCanvas1 = new DCCanvas(c1); 
// "c1" is a name of your pre-created standard Canvas. 
      this.grid1.Children.Add(rusCanvas1); 
      this.grid1.Children.Remove(c1); 

Wystarczy go skopiować i usunąć starą.

Napisałem tę klasę, ponieważ chcę, aby ta funkcja była dostępna jako standard. Mam na myśli, że Canvas (i wszystkie inne kontrolki i obiekty!) Muszą obsługiwać podwójne kliknięcia bez dodatkowego kodowania ...

5

Przepraszamy za spóźnienie na imprezę, ale chciałbym zasugerować, że " lepiej z pierwszą odpowiedzią (przez Jastera) na Why doesnt WPF border control have a mousedoubleclick event?.

Jest o wiele bardziej przejrzysty i nie używa nawet jednej linii kodu, dlatego jest w pełni zgodny z MVVM i powinien być na najlepszej drodze.

<Window x:Class="Yoda.Frontend.MainView" x:Name="MainViewWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Border> 
    <Border.InputBindings> 
     <MouseBinding MouseAction="LeftDoubleClick" 
        Command="{Binding YourBindableCommand}" 
        CommandParameter="{Binding}" /> 
    </Border.InputBindings> 
    </Border> 
</Window> 

Uwaga: Oczywiście, trzeba zastąpić YourBindableCommand z odpowiedniego polecenia, prawdopodobnie dostarczony przez ViewModel. Jeśli potrzebujesz pomocy, daj mi znać.

+0

Dla tych, którzy odrzucili moją poprawioną odpowiedź: proszę albo przekazać informację zwrotną na temat tego, co (nadal) nie jest wystarczająco wzmocnione, albo usunąć -1. Wszystko inne jest po prostu bezużyteczne, ponieważ nikomu nie pomoże. – Yoda

Powiązane problemy