2010-01-12 5 views
6

J'essaie d'obtenir les coordonnées X, Y d'un contrôle contextuel. J'ai essayé:Contrôle contextuel WPF - Trouver coordonnées X, Y

VisualTreeHelper.GetOffset (Popup);

mais le vecteur contient toujours retourné (0,0) pour X et Y.

Le parent de la fenêtre est la racine de mise en page, qui est une grille.

Le CustomPopupPlacementCallback renvoie également toujours 0,0 pour son paramètre Point.

L'objectif est de permettre à l'utilisateur de faire glisser le popup n'importe où sur l'écran. J'allais essayer d'accomplir cela en obtenant la position actuelle de la fenêtre contextuelle et de la souris, et en déplaçant la fenêtre contextuelle dans la même direction que celle de la souris. Mise à jour

-------------------- --------------------

Chris Nicol, j'ai essayé votre réponse avec le code suivant, mais toujours recevoir 0,0 pour 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> 

code Derrière:

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

J'ai le même problème, avez-vous trouvé une solution? Cordialement – Cinaird

+0

Je n'ai pas trouvé de solution. Désolé pour un long délai. – gamzu07

+0

Ok, Merci pour la réponse – Cinaird

Répondre

2

Pas sûr que ce soit la meilleure façon de trouver cela, mais il fonctionne:

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

Oui, c'est * * le meilleur moyen de le faire. Je le fais habituellement en une seule ligne: 'controlToFind.TransformToAncestor (TopLevelControl) .Transform (nouveau Point (0,0))' –

+0

yup, de même, je le fais en une ligne. Je viens de le séparer pour l'exemple afin qu'il soit plus facile de comprendre –

+0

Merci pour l'aide jusqu'à présent, vérifiez ma mise à jour si vous avez le temps. – gamzu07

2

Vous devez utiliser win32 api:

ajouter ceci à votre 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 
    } 

pour trouver les coordonnées X, Y entrez ceci à votre code (en rect vous avez demandé les coordonnées):

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

     RECT rect = new RECT(); 
     GetWindowRect(handle, out rect); 
Questions connexes