2009-10-30 10 views
7

अगर यह जहां यह स्क्रीन के किनारे से बाहर भी होगा रख दिया गया है एक पॉपअप के डिफ़ॉल्ट व्यवहार है, पॉपअप खुद का स्थान होगा। क्या इस व्यवहार को बंद करने का कोई तरीका है?बनाने के एक WPF पॉपअप नहीं बाध्य स्क्रीन

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

उत्तर

3

बस अपने पॉपअप (उन्हें खींचें)

यहाँ जो खींचें प्रक्रिया

क्षेत्र अंगूठे

private Thumb mThumb = null; 
    public Thumb Thumb 
    { 
     get { return mThumb; } 
     set 
     { 
      if (mThumb != value) 
      { 
       if (mThumb != null) 
       { 
        DetachThumb(); 
       } 
       mThumb = value; 
       if (mThumb != null) 
       { 
        AttachThumb(); 
       } 
      } 
     } 
    } 

    private void AttachThumb() 
    { 
     Thumb.DragStarted += Thumb_DragStarted; 
     Thumb.DragDelta += Thumb_DragDelta; 
     Thumb.DragCompleted += Thumb_DragCompleted; 
    } 

    private void DetachThumb() 
    { 
     Thumb.DragStarted -= Thumb_DragStarted; 
     Thumb.DragDelta -= Thumb_DragDelta; 
     Thumb.DragCompleted -= Thumb_DragCompleted; 
    } 

    private void Thumb_DragStarted(object sender, DragStartedEventArgs e) 
    { 
     mIsThumbDragging = true; 
     mPreviousDiffX = 0; 
     mPreviousDiffY = 0; 
    } 

    private void Thumb_DragDelta(object sender, DragDeltaEventArgs e) 
    { 
     if (mIsMoving) 
     { 
      return; 
     } 
     mIsMoving = true; 
     try 
     { 
      if (mIsThumbDragging) 
      { 
       var doubleDetaX = e.HorizontalChange + mPreviousDiffX; 
       var doubleDetaY = e.VerticalChange + mPreviousDiffY; 

       var deltaX = (int)doubleDetaX; 
       var deltaY = (int)doubleDetaY; 

       mPreviousDiffX = (double)deltaX - doubleDetaX; 
       mPreviousDiffY = (double)deltaY - doubleDetaY; 

       HostPopup.Move(deltaX, deltaY); 
      } 
     } 
     finally 
     { 
      mIsMoving = false; 
     } 
    } 

    private void Thumb_DragCompleted(object sender, DragCompletedEventArgs e) 
    { 
     mIsThumbDragging = false; 
    } 

    #endregion 

HostPopup वर्ग पॉपअप के उपवर्ग है ट्रैक करेगा अंगूठे के लिए कोड है स्थानांतरित करने के लिए इंटरॉप का उपयोग , और यह निम्न विधियों खिड़की स्थानांतरित करने के लिए इंटरॉप का उपयोग कर HASE:

[DllImport("user32.dll", SetLastError = true)] 
    internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); 

    internal void Move(int deltaX, int deltaY) 
    { 
     if (mIsMoving) 
     { 
      return; 
     } 
     mIsMoving = true; 
     try 
     { 
      if (Child == null) 
       return; 

      var hwndSource = (PresentationSource.FromVisual(Child)) as HwndSource; 

      if (hwndSource == null) 
       return; 
      var hwnd = hwndSource.Handle; 

      RECT rect; 

      if (!GetWindowRect(hwnd, out rect)) 
       return; 

      MoveWindow(hwnd, rect.Left + deltaX, rect.Top + deltaY, (int)Width, (int)Height, true); 
     } 
     finally 
     { 
      mIsMoving = false; 
     } 
    } 
+1

क्या कोई इसे आगे बढ़ाने के बारे में विस्तार से समझा सकता है? मैं HostPopup उपclass तक पहुंच कैसे प्राप्त करूं? GetWindowRect() विधि कहां रहती है? – Saggio

2

आप पॉपअप अधिक एक खिड़की की तरह व्यवहार करना चाहते हैं, मैं सिर्फ एक पॉपअप के बजाय एक खिड़की बनाना चाहते हैं।

, एक पॉपअप है कि अपने आप में एक मानक पॉपअप की तरह की स्थिति नहीं है, और आप स्क्रीन के चारों ओर खींचें करने की अनुमति देता करने के बाद सिर्फ कम प्रयोज्य और भ्रम की स्थिति के लिए एक नुस्खा की तरह लगता है।

+3

दुर्भाग्य से, फिर एक पॉपअप की कार्यक्षमता है जो खिड़की नहीं है और गति की स्वतंत्रता से मेरे लिए अधिक महत्वपूर्ण है। मुझे लगता है कि मुझे आंदोलन को सीमित करना होगा, इसलिए स्क्रीन सीमाओं से आगे जाने का कोई मौका नहीं है और इस तरह कोई पुनर्स्थापन नहीं है और कोई झटका नहीं है। जानकारी के लिए धन्यवाद। –

+1

सहमत हुए। मैं पॉपअप विंडो का पालन करें और WPF अनुप्रयोग (अनिवार्य रूप से एक व्यस्त सूचक) में आयोजित एक WinForm नियंत्रण में इनपुट रोकने के लिए और अगर खिड़की के पर्दे से दूर घसीटा जाता है तो पॉपअप अभ्यस्त पिछले स्क्रीन सीमा खिड़की का पालन करना चाहते हैं। –

+0

इस पर एक और डेटा बिंदु। कभी कभी पॉपअप गोली मोड के साथ Windows 10 पर एक खिड़की खोलने Win10 की स्क्रीन विभाजन कार्यवाही प्रारंभ करें और खींचें को बाधित करेगा के बाद से सामग्री खींच लिए विंडो बेहतर है। (संदर्भ: मैं पॉपअप अस्थायी रूप से ड्रैग फीडबैक विंडो के रूप में उपयोग कर रहा हूं, यूआई के अनुक्रमिक भाग नहीं) – jschroedl

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