2010-01-12 21 views
6

Sto cercando di ottenere le coordinate X, Y di un controllo popup. Ho provato:WPF Popup Controllo - Trova coordinate x, y

VisualTreeHelper.GetOffset (Popup);

ma il vettore restituito sempre contiene (0,0) per X e Y.

Il genitore della comparsa è la radice di layout, che è una griglia.

Anche il CustomPopupPlacementCallback restituisce sempre 0,0 per il suo parametro Point.

L'obiettivo è consentire all'utente di trascinare il popup ovunque sullo schermo. Stavo per cercare di ottenere questo ottenendo la posizione attuale di popup e mouse e spostando il popup nella stessa direzione del mouse.

Aggiornamento -------------------- --------------------

Chris Nicol, ho cercato la risposta con il seguente codice, ma continuare a ricevere 0,0 per rootPoint:

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> 

codice Dietro:

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

Ho lo stesso problema, hai trovato qualche soluzione? Cordiali saluti – Cinaird

+0

Non ho trovato una soluzione. Ci scusiamo per un lungo ritardo. – gamzu07

+0

Ok, grazie per la risposta – Cinaird

risposta

2

Non è sicuro questo è il modo migliore di scoprire che fuori, ma funziona:

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

Sì, questo * è * il modo migliore per farlo. Di solito lo faccio in una sola riga: 'controlToFind.TransformToAncestor (TopLevelControl) .Transform (new Point (0,0))' –

+0

yup, analogamente, lo faccio in una riga. L'ho appena separato per l'esempio in modo che sia più facile da capire –

+0

Grazie per l'aiuto finora, controlla il mio aggiornamento se hai tempo. – gamzu07

2

È necessario utilizzare API Win32:

aggiungere questo alla classe:

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

per la ricerca di coordinate x, y immettere questo al codice (nel rect hai richiesto coordinate):

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

     RECT rect = new RECT(); 
     GetWindowRect(handle, out rect); 
Problemi correlati