2012-02-09 27 views
12

Có sự kiện nào kích hoạt sự kiện nhấp đúp trên biên giới cửa sổ WPF không?Nhấp đúp vào sự kiện trên cửa sổ WPF Biên giới

Tôi có thể bắt nó như thế nào?

Cảm ơn!

+1

Có thể điều này sẽ giúp - http://stackoverflow.com/questions/3410768/why-doesnt-wpf-border-control-have-a-mousedoubleclick-event –

+0

@BaliC Xin lỗi, tôi không hiểu cách tôi có thể làm điều đó cho cửa sổ WPF đơn giản? – Terminador

+0

Bạn có nghĩa là nhấp đúp chuột vào cửa sổ chrome? Cùng một cú nhấp đúp gây ra tối đa hóa/thu nhỏ cửa sổ? – ppiotrowicz

Trả lời

30

Dưới đây là một cách .. Chỉ cần thiết lập Window.WindowStyle của bạn để "Không" và tạo xuống đường viền cửa sổ của bạn:

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

Trong mã sau:

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

Cảm ơn! Nhưng tôi đang nói về biên giới cửa sổ bản địa ... và bạn đề nghị sử dụng kiểm soát biên giới WPF ... – Terminador

+0

Tôi đề nghị rằng một cách để tấn công là để vẽ biên giới của riêng bạn, sau đó bạn sẽ có toàn quyền kiểm soát các sự kiện. – RQDQ

+0

Ahhh Sau đó, có nó có thể là một giải pháp. Cảm ơn bạn! – 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(); 
     } 
    } 
} 

đây trên là lớp Canvas của tôi. Bạn có thể sử dụng nó để làm cho nó đơn giản để xử lý các nhấp chuột đôi trên Canvas của bạn. Nó sẽ kích hoạt mỗi lần nhấp chuột thứ hai trong khoảng thời gian được chỉ định (const DOUBLE_CLICK_INTERVAL trong mã). Dường như với tôi không phải là rất khó để sử dụng:

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

Nếu bạn không muốn viết thuộc tính cho Canvas, bạn có thể thêm một constructor-copyer vào trong lớp:

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, Bây giờ bạn có thể tạo Canvas của bạn trong trình chỉnh sửa trực quan và sau đó viết như sau:

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

Chỉ cần sao chép và xóa ảnh cũ.

Tôi đã viết lớp này, vì tôi muốn tính năng này khả dụng ở dạng standart. Ý tôi là, Canvas (và tất cả các điều khiển và đối tượng khác!) Phải có khả năng xử lý các nhấp đúp vào nó mà không cần mã hóa thêm ...

5

Xin lỗi vì đã đến muộn, nhưng tôi muốn đề nghị bạn ' tốt hơn với câu trả lời đầu tiên (bởi Jaster) đến Why doesnt WPF border control have a mousedoubleclick event?.

Đó là cách gọn gàng hơn và thậm chí không sử dụng một dòng mã duy nhất phía sau, do đó nó hoàn toàn tuân thủ MVVM và phải là cách của bạn để đi.

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

Lưu ý: Tất nhiên, bạn phải thay thế YourBindableCommand với lệnh thích hợp, có thể được cung cấp bởi ViewModel của bạn. Nếu bạn cần giúp đỡ về điều đó, hãy cho tôi biết.

+0

Đối với bất kỳ ai đã bỏ phiếu cho câu trả lời được cải thiện của tôi: vui lòng cung cấp phản hồi về những gì (vẫn còn) chưa được nâng cao hoặc loại bỏ -1. Mọi thứ khác chỉ là vô ích vì nó sẽ không giúp được bất cứ ai. – Yoda

Các vấn đề liên quan