2010-01-12 17 views
6

मुझे पॉपअप नियंत्रण के एक्स, वाई निर्देशांक प्राप्त करने का प्रयास कर रहा है। मैंने कोशिश की है:डब्ल्यूपीएफ पॉपअप कंट्रोल - एक्स, वाई कोऑर्डिनेट्स

VisualTreeHelper.GetOffset (पॉपअप);

लेकिन वेक्टर हमेशा होता है वापस लौटे (0,0) एक्स और वाई

पॉपअप की मूल के लिए लेआउट जड़ है, जो एक ग्रिड है।

कस्टमपॉपअप प्लेसमेंट कॉलबैक हमेशा इसके पॉइंट पैरामीटर के लिए 0,0 देता है।

लक्ष्य उपयोगकर्ता को स्क्रीन पर कहीं भी पॉपअप खींचने की अनुमति देना है। मैं वर्तमान पॉपअप और माउस की स्थिति प्राप्त करके और माउस चाल की एक ही दिशा में पॉपअप को स्थानांतरित करके इसे पूरा करने और पूरा करने जा रहा था।

-------------------- अद्यतन --------------------

क्रिस निकोल, मैं निम्नलिखित कोड के साथ अपने जवाब की कोशिश की है, लेकिन अभी भी rootPoint के लिए 0,0 प्राप्त करते हैं:

Xaml:

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="Test.MainWindow" 
x:Name="Window" 
Title="MainWindow" 
Width="800" Height="600">  

<Grid x:Name="LayoutRoot"> 
    <Popup x:Name="Popup" IsOpen="True" Placement="Center" Width="100" Height="100"> 
     <Button Click="Button_Click" Content="Test" /> 
    </Popup> 
</Grid> 

कोड के पीछे:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     this.InitializeComponent(); 

     // Insert code required on object creation below this point. 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     GeneralTransform transform = Popup.TransformToAncestor(LayoutRoot); 
     Point rootPoint = transform.Transform(new Point(0, 0)); 
    } 
} 
+0

मुझे एक ही समस्या है, क्या आपको कोई समाधान मिला? दया – Cinaird

+0

मुझे कोई समाधान नहीं मिला। लंबी देरी के लिए खेद है। – gamzu07

+0

ठीक है, – Cinaird

उत्तर

2

सुनिश्चित नहीं हैं कि यह है कि यह जानने का सबसे अच्छा तरीका है, लेकिन यह काम करता है:

GeneralTransform transform = controlToFind.TransformToAncestor(TopLevelControl); 
      Point rootPoint = transform.Transform(new Point(0, 0)); 
+0

प्रतिक्रिया के लिए धन्यवाद हाँ, यह * करने का सबसे अच्छा तरीका है। मैं आमतौर पर इसे एक पंक्ति में करता हूं: 'controlToFind.TransformToAncestor (TopLevelControl)। ट्रांसफॉर्म (नया प्वाइंट (0,0)) ' –

+0

yup, वैसे ही, मैं इसे एक पंक्ति में करता हूं। मैंने इसे उदाहरण के लिए अलग कर दिया है ताकि –

+0

को समझना आसान हो, अब तक सहायता के लिए धन्यवाद, यदि आपके पास समय है तो मेरे अपडेट की जांच करें। – gamzu07

2

आप Win32 एपीआई का उपयोग करना चाहिए:

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

    [StructLayout(LayoutKind.Sequential)] 
    private struct RECT 
    { 
     public int Left; // X coordinate of topleft point 
     public int Top; // Y coordinate of topleft point 
     public int Right; // X coordinate of bottomright point 
     public int Bottom; // Y coordinate of bottomright point 
    } 

:

अपनी कक्षा में जोड़ना एक्स खोजने के लिए, वाई समन्वय आपके कोड पर इनपुट करता है (जिसमें आपने निर्देशांक का अनुरोध किया है):

 IntPtr handle = (PresentationSource.FromVisual(popup.Child) as HwndSource).Handle; 

     RECT rect = new RECT(); 
     GetWindowRect(handle, out rect); 
संबंधित मुद्दे