2012-02-09 22 views
12

¿Hay algún evento que se dispare al hacer doble clic en el evento en el borde de la ventana de WPF?Hacer doble clic en el evento en el borde de la ventana de WPF

¿Cómo puedo atraparlo?

Gracias!

+1

Tal vez esto ayude - http://stackoverflow.com/questions/3410768/why-doesnt-wpf-border-control-have-a-mousedoubleclick-event –

+0

@BaliC Lo siento, no entiendo cómo puedo hacerlo por la ventana simple de WPF? – Terminador

+0

¿Quiere decir hacer doble clic en la ventana chrome? ¿El mismo doble clic que causa maximizar/minimizar la ventana? – ppiotrowicz

Respuesta

30

Aquí es una manera .. Sólo tienes que configurar su Window.WindowStyle en "None" y crear la ventana de su borde hacia abajo:

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

En código detrás:

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

¡Gracias! Pero estoy hablando del borde nativo de la ventana ... y sugieres usar el control de borde WPF ... – Terminador

+0

Sugerí que una forma de atacar era dibujar tu propio borde, entonces tendrías control total sobre los eventos. – RQDQ

+0

Ahhh Entonces sí, podría ser una solución. ¡Gracias! – 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(); 
     } 
    } 
} 

Aquí arriba es mi clase Canvas. Puede usarlo para simplificar el manejo de clics dobles en su lienzo. Se disparará con cada segundo mouseUp en el intervalo especificado (const DOUBLE_CLICK_INTERVAL en el código). Me parece que no es muy difícil de usar:

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()); 
    } 
} 

Si no desea escribir propiedades de la tela, se puede añadir un constructor de Copyer a la clase:

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, ahora puede crear su lienzo en el editor visual y luego escribir así:

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

Sólo tienes que copiar y borrar uno viejo.

Escribí esta clase, ya que quiero que esta característica esté disponible como estándar. Quiero decir, Canvas (¡y todos los demás controles y objetos!) Deben poder hacer doble clic en él sin codificación adicional ...

5

Disculpa el retraso en la fiesta, pero me gustaría sugerir que lo hagas. mejora con la primera respuesta (por Jaster) al Why doesnt WPF border control have a mousedoubleclick event?.

Es mucho más limpio y ni siquiera usa una sola línea de código, por lo tanto, es totalmente compatible con MVVM y debería ser su camino a seguir.

<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> 

Nota: Por supuesto, usted tiene que reemplazar YourBindableCommand con el mandato adecuado, probablemente recibida por su modelo de vista. Si necesitas ayuda con eso, házmelo saber.

+0

A quien haya votado mi respuesta mejorada: envíe sus comentarios sobre lo que todavía no se ha mejorado o elimine el -1. Todo lo demás es inútil ya que no ayudará a nadie. – Yoda

Cuestiones relacionadas