2012-02-09 33 views
12

是否有任何事件在WPF窗口边框上的双击事件上触发?双击WPF窗口边框上的事件

我怎么能抓到它?

谢谢!

+1

也许这会帮助 - http://stackoverflow.com/questions/3410768/why-doesnt-wpf-border-control-have-a-mousedoubleclick-event – 2012-02-09 14:52:32

+0

@BaliC对不起,我不明白我可以如何为简单的WPF窗口做? – Terminador 2012-02-09 14:55:59

+0

你的意思是双击窗口镶边?导致窗口最大化/最小化的相同双击? – ppiotrowicz 2012-02-09 14:58:11

回答

30

这里有一种方法..只要设置你的Window.WindowStyle为 “无”,创造你的下窗口边界:

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

在后面的代码:

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

谢谢!但我正在谈论本地窗口边界...并且您建议使用WPF边框控制... – Terminador 2012-02-09 15:05:24

+0

我建议一种攻击方式是绘制自己的边框,然后您将完全控制事件。 – RQDQ 2012-02-09 15:13:40

+0

Ahhh然后是的,这可能是一个解决方案。谢谢! – Terminador 2012-02-09 15:45:48

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

这里以上是我的Canvas类。您可以使用它来简化处理画布上的双击。它将在指定的时间间隔内每隔一秒钟触发一次(代码中为const DOUBLE_CLICK_INTERVAL)。 在我看来,不是很难使用:

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

如果你不想写属性的画布,你可以在构造函数copyer添加到类:

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,现在,您可以创建你的可视化编辑器的画布,然后像这样写:

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

只需复制并删除旧的。

我写了这个类,因为我希望此功能可以作为标准使用。我的意思是,帆布(和所有其他控件和对象!)必须能够处理双击它,而无需额外的编码...

5

对不起,迟到派对,但我想建议你'第一个答案(由Jaster)改为Why doesnt WPF border control have a mousedoubleclick event?

它更简洁,甚至不使用单一代码行,因此它完全符合MVVM标准,应该是您的方法。

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

注:当然,你必须使用相应的命令,可能是您的视图模型提供更换YourBindableCommand。如果您需要帮助,请告诉我。

+0

任何人投票拒绝我的改进答案:请提供什么(仍)没有足够增强的反馈或删除-1。其他一切都没用,因为它不会帮助任何人。 – Yoda 2016-10-28 12:37:41