2010-07-18 13 views
8

प्राप्त किए बिना विंडोलेस WPF विंडो ड्रैग करने योग्य बनाने का तरीका मेरे पास एक विंडो कम WPF मुख्य विंडो है। मैं इसे बनाने की कोशिश कर रहा हूं ताकि अंतिम उपयोगकर्ता विंडो खींच सके।अमान्यऑपरेशन एक्सेप्शन

मैं खिड़की के निर्माता के लिए निम्न जोड़ दिया है:

this.MouseLeftButtonDown += delegate { DragMove(); }; 

समस्या है, मैं एक संवाद बॉक्स दो बटन के साथ ऊपर खुलती है। जब मैं इन बटनों में से किसी एक पर क्लिक करता हूं, तो मुझे संदेश के साथ एक अमान्य ऑपरेशन अपवाद मिला है "जब प्राथमिक माउस बटन नीचे होता है तो केवल ड्रैगमोव को कॉल कर सकता है।"

यह कुछ प्रश्न उठाता है: संवाद में एक मूसडाउन घटना के साथ इसका कोई संबंध नहीं होगा? मैं इस अपवाद के बिना यह कैसे कर सकता हूं?

धन्यवाद!

+0

मेरे पास बटन के साथ सीमा कम खिड़कियां भी हैं और उपयोगकर्ता को बाएं माउस बटन दबाकर खींचें और यह ठीक काम करता है। कृपया इस व्यवहार को दिखाते हुए एक न्यूनतम लेकिन पूर्ण कोड नमूना प्रदान करें। –

उत्तर

7

एक सीमाहीन खिड़की चलने का 'सही' तरीका WM_NCHITTEST संदेश में HTCAPTION को वापस करना है। निम्नलिखित कोड दिखाता है कि यह कैसे करें। ध्यान दें कि यदि आप कर्सर आपके विंडो के कुछ दृश्य तत्वों से अधिक है, तो आप HTCLIENT वापस करना चाहेंगे, इसलिए यह कोड आपको प्रारंभ करने के लिए है।

http://msdn.microsoft.com/en-us/library/ms645618(VS.85).aspx

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnSourceInitialized(EventArgs e) 
    { 
     HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(this); 
     hwndSource.AddHook(WndProcHook); 
     base.OnSourceInitialized(e); 
    } 

    private static IntPtr WndProcHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handeled) 
    { 
     if (msg == 0x0084) // WM_NCHITTEST 
     { 
      handeled = true; 
      return (IntPtr)2; // HTCAPTION 
     } 
     return IntPtr.Zero; 
    } 
} 
+0

यदि आप "WM_NCHITTEST संदेश में HTCAPTION को वापस करने का प्रयास करते हैं" जैसा कि टर्गिवर सुझाव देता है, तो बटन क्लिक करने योग्य नहीं होंगे यानी क्लिक ईवेंट बटन के लिए काम नहीं करेगा। क्या किसी के पास इसके लिए कोई कामकाज है? –

+0

ध्यान दें कि मैंने कहा है कि वह कोड केवल एक प्रारंभिक बिंदु था। आप उपरोक्त कोड के रूप में अपनी खिड़की के पूरे आयत के लिए HTCAPTION वापस नहीं कर सकते हैं। आपको यह तय करना होगा कि आपकी खिड़की का कौन सा क्षेत्र 'कैप्शन' क्षेत्र नहीं होना चाहिए। यह आपके नियंत्रण क्षेत्र में एक आयत के रूप में सरल हो सकता है, या दृश्य पेड़ को चलाने और नियंत्रण की तलाश के रूप में जटिल हो सकता है। – Tergiver

0

किसी Microsoft परियोजना है कि सभी "खिड़की" शैली और भी बहुत कुछ संभालती है, और यह खुला स्रोत है, तो आप http://code.msdn.microsoft.com/WPFShell पर एक नज़र डालें कर सकते हैं। मैं एक वाणिज्यिक वित्तीय आवेदन पर उपयोग कर रहा हूं, और अभी तक विंडोज़ के किसी भी संस्करण पर किसी भी मुद्दे पर नहीं चला है।

1

सेट खिड़की या किसी अन्य नियंत्रण से MouseDown atrribute आप उपयोग करना चाहते:

<TextBlock Grid.Column="0" HorizontalAlignment="Stretch" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" >Handy Dandy</TextBlock> 

और इसे लागू कोड में पीछे इस तरह:

private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    this.DragMove(); 
} 

से: http://www2.suddenelfilio.net/2007/01/19/wpf-draggable-windowless-windows/

0

आप मूल विधि को ओवरराइड कर सकते हैं:

public new void DragMove() 
    { 
     if (this.WindowState == WindowState.Normal) 
     { 
      SendMessage(hs.Handle, WM_SYSCOMMAND, (IntPtr)0xf012, IntPtr.Zero); 
      SendMessage(hs.Handle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero); 
     } 
    } 
संबंधित मुद्दे