Wpf में विंडो के भीतर तत्व की पूर्ण स्थिति प्राप्त करें


88

मैं डबल क्लिक होने पर विंडो / रूट तत्व के संबंध में एक तत्व की पूर्ण स्थिति प्राप्त करना चाहूंगा। माता-पिता के भीतर तत्व की सापेक्ष स्थिति वह है जिसे मैं प्राप्त कर सकता हूं, और मैं जो पाने की कोशिश कर रहा हूं वह खिड़की के सापेक्ष बिंदु है। मैंने स्क्रीन पर एक तत्व के बिंदु को कैसे प्राप्त किया जाए, इसका समाधान देखा है, लेकिन खिड़की में नहीं।

जवाबों:


127

मुझे लगता है कि ब्रैंडन एस जो चाहता है वह जड़ तत्व के सापेक्ष माउस की स्थिति नहीं है , बल्कि कुछ वंशज तत्व की स्थिति है।

उसके लिए, ट्रांसफॉर्मटऑन्टर विधि है:

Point relativePoint = myVisual.TransformToAncestor(rootVisual)
                              .Transform(new Point(0, 0));

myVisualवह तत्व कहां है जो सिर्फ डबल-क्लिक किया गया था, और rootVisualApplication.Current.MainWindow या जो आप के सापेक्ष स्थिति चाहते हैं।


2
नमस्ते, मैंने यह कोशिश की और मुझे निम्नलिखित अपवाद प्राप्त हुए: System.InvalidOperationException अनहेल्दी था संदेश = निर्दिष्ट दृश्य इस विज़ुअल का पूर्वज नहीं है। Source = PresentationCore कोई विचार?
RoflcoptrException

8
Visual.TransformToAncestor केवल तभी काम करेगा जब आप किसी विजुअल में पास होंगे। यदि आप दो तत्वों की सापेक्ष स्थिति चाहते हैं और एक में दूसरा नहीं है, तो आप इसके बजाय Visual.TransformToVisual का उपयोग कर सकते हैं।
रॉबर्ट मैकनी

5
TransformToVisual को अभी भी एक सामान्य पूर्वज की आवश्यकता है जो समस्याग्रस्त हो सकता है यदि नियंत्रण एक पॉपअप में हो
एडम मिल्स

1
सुपर सहज! क्या वे इसे "GetRelativePosition" कॉल में लपेट नहीं सकते हैं? :-) सहायता के लिए धन्यवाद। +1
पॉल

1
@ Cod3monk3y - या शायद, अगर Microsoft खुले स्रोतों WPF, मैं उन्हें एक पुल अनुरोध भेज देंगे :-)
पॉल

41

विंडो में आपके द्वारा उपयोग किए जा सकने वाले UI तत्व की पूर्ण स्थिति प्राप्त करने के लिए:

Point position = desiredElement.PointToScreen(new Point(0d, 0d));

यदि आप एक उपयोगकर्ता नियंत्रण के भीतर हैं, और बस उस नियंत्रण के भीतर UI तत्व की सापेक्ष स्थिति चाहते हैं, तो बस उपयोग करें:

Point position = desiredElement.PointToScreen(new Point(0d, 0d)),
controlPosition = this.PointToScreen(new Point(0d, 0d));

position.X -= controlPosition.X;
position.Y -= controlPosition.Y;

4
ध्यान दें कि यह वह नहीं करता है जो आप उम्मीद करते हैं यदि आपका प्रदर्शन स्केलिंग 100% (यानी उच्च डीपीआई स्क्रीन पर) सेट नहीं है।
आकर्षित नोक

18

इस विधि को एक स्थिर वर्ग में जोड़ें:

 public static Rect GetAbsolutePlacement(this FrameworkElement element, bool relativeToScreen = false)
    {
        var absolutePos = element.PointToScreen(new System.Windows.Point(0, 0));
        if (relativeToScreen)
        {
            return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight);
        }
        var posMW = Application.Current.MainWindow.PointToScreen(new System.Windows.Point(0, 0));
        absolutePos = new System.Windows.Point(absolutePos.X - posMW.X, absolutePos.Y - posMW.Y);
        return new Rect(absolutePos.X, absolutePos.Y, element.ActualWidth, element.ActualHeight);
    }

संपूर्ण स्क्रीन के ऊपरी बाएं कोने से प्लेसमेंट के लिए या एप्लिकेशन विंडो के ऊपरी बाएं कोने से प्लेसमेंट के लिए relativeToScreenपैरामैटर सेट करें ।truefalse


1
यह काल्पनिक रूप से काम करता है! मैं एक एनीमेशन के साथ इसका उपयोग कर रहा हूं RenderTransform, जो तत्व के संशोधन द्वारा एक छवि को ऑन या ऑफ-स्क्रीन स्लाइड करता है, और इसलिए इसे स्क्रीन पर तत्व की पूर्ण स्थिति को जानने की आवश्यकता है।
Cod3monk3y

6

.NET 3.0 के बाद से, आप बस उपयोग कर सकते हैं *yourElement*.TranslatePoint(new Point(0, 0), *theContainerOfYourChoice*)

यह आपको आपके बटन का बिंदु 0, 0 देगा, लेकिन कंटेनर की ओर। (आप एक अन्य बिंदु भी दे सकते हैं कि 0, 0)

डॉक्टर के लिए यहां देखें।


0

हम्म। आपको वह विंडो निर्दिष्ट करनी होगी जो आपने Mouse.GetPosition(IInputElement relativeTo) निम्नलिखित कोड में मेरे लिए अच्छी तरह से काम की है

protected override void OnMouseDown(MouseButtonEventArgs e)
    {
        base.OnMouseDown(e);
        Point p = e.GetPosition(this);
    }

मुझे संदेह है कि आपको खिड़की से संदर्भित करने की आवश्यकता नहीं है यह स्वयं की कक्षा से नहीं, बल्कि आवेदन के अन्य बिंदु से। इस मामले में Application.Current.MainWindowआपकी मदद करेगा।


हालांकि यह ऐसा नहीं है कि लेखक ने क्या मांगा है, यह मुझे सही रास्ते पर मिला, धन्यवाद
लादिस्लाव ऑन्ड्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.