2012-02-09 21 views
12

क्या कोई ऐसी घटना है जो WPF विंडो सीमा पर डबल-क्लिक ईवेंट पर आग लगती है?WPF विंडो सीमा पर डबल-क्लिक ईवेंट

मैं इसे कैसे पकड़ सकता हूं?

धन्यवाद!

+1

शायद यह मदद करेगा - http://stackoverflow.com/questions/3410768/why-doesnt-wpf-border-control-have-a-mousedoubleclick-event –

+0

@ बालीसी क्षमा करें, मुझे समझ में नहीं आता कि मैं कैसे कर सकता हूं इसे सरल WPF विंडो के लिए करें? – Terminador

+0

आपका मतलब खिड़की क्रोम पर डबल क्लिक करें? वही डबल क्लिक जो खिड़की को अधिकतम/छोटा करता है? – ppiotrowicz

उत्तर

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

धन्यवाद! लेकिन मैं मूल खिड़की सीमा के बारे में बात कर रहा हूं ... और आप डब्ल्यूपीएफ सीमा नियंत्रण का उपयोग करने का सुझाव देते हैं ... – Terminador

+0

मैंने सुझाव दिया कि हमला करने का एक तरीका अपनी सीमा खींचना था, तो आप घटनाओं पर पूर्ण नियंत्रण रखेंगे। – RQDQ

+0

अहह तो हाँ यह एक समाधान हो सकता है। धन्यवाद! – 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(); 
     } 
    } 
} 

मेरा कैनवास वर्ग है। आप अपने कैनवास पर डबल क्लिक को संभालने में आसान बनाने के लिए इसका उपयोग कर सकते हैं। यह निर्दिष्ट अंतराल में प्रत्येक दूसरे माउसअप के साथ आग लग जाएगा (कोड में DOUBLE_CLICK_INTERVAL को कॉन्स्ट करें)। मेरे लिए उपयोग करने के लिए बहुत मुश्किल नहीं लगता है:,

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:

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 जोड़ सकते हैं, अब आप दृश्य संपादक में आपका कैनवास बना सकते हैं और फिर इस प्रकार लिख:

  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

पार्टी के देर से होने के लिए खेद है, लेकिन मैं आपको यह सुझाव देना चाहता हूं कि आप ' पहले जवाब (जस्टर द्वारा) Why doesnt WPF border control have a mousedoubleclick event? पर बेहतर जवाब दें।

यह तरीका अधिक क्लीनर है और कोड की एक पंक्ति का भी उपयोग नहीं करता है, इसलिए यह पूरी तरह से एमवीवीएम-अनुरूप है और इसे जाने का आपका तरीका होना चाहिए।

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

नोट: बेशक, आप उचित आदेश, शायद अपने ViewModel द्वारा प्रदान के साथ YourBindableCommand को बदलने के लिए। अगर आपको उस पर मदद की ज़रूरत है, तो बस मुझे बताएं।

+0

जो भी मेरे बेहतर उत्तर को वोट देता है: कृपया या तो प्रतिक्रिया दें (अभी भी) पर्याप्त नहीं बढ़ाया गया है या -1 को हटा दें। बाकी सब कुछ बेकार है क्योंकि यह किसी की भी मदद नहीं करेगा। – Yoda

संबंधित मुद्दे