2010-01-12 17 views
6

Estoy tratando de obtener las coordenadas X, Y de un control emergente. Lo he intentado:WPF Popup Control - Buscar X, Y Coordenadas

VisualTreeHelper.GetOffset (Popup);

pero regresó el vector siempre contiene (0,0) para X e Y.

El padre de la ventana emergente es la raíz de disposición, que es una cuadrícula.

CustomPopupPlacementCallback también devuelve siempre 0,0 para su parámetro Punto.

El objetivo es permitir al usuario arrastrar la ventana emergente en cualquier lugar de la pantalla. Iba a tratar de lograr esto obteniendo la posición actual del pop-up y del mouse, y moviendo la ventana emergente en la misma dirección en que se mueve el mouse.

actualización -------------------- --------------------

Chris Nicol, he intentado su respuesta con el siguiente código, pero aún así recibir 0,0 para 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> 

código subyacente:

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

Tengo el mismo problema, ¿encontró alguna solución? Saludos cordiales – Cinaird

+0

No he encontrado una solución. Perdón por un gran retraso. – gamzu07

+0

Ok, gracias por la respuesta – Cinaird

Respuesta

2

No estoy seguro es la mejor manera de averiguarlo, pero funciona:

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

Sí, esa * es * la mejor manera de hacerlo. Normalmente lo hago en una sola línea: 'controlToFind.TransformToAncestor (TopLevelControl) .Transform (new Point (0,0))' –

+0

yup, del mismo modo, lo hago en una línea. Simplemente lo separé por el ejemplo para que sea más fácil de entender –

+0

Gracias por la ayuda hasta el momento, verifique mi actualización si tiene tiempo. – gamzu07

2

Debe utilizar la API de Win32:

añadir esto a su clase:

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

para encontrar coordenadas X, Y, ingrese esto a su código (en rect usted ha solicitado las coordenadas):

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

     RECT rect = new RECT(); 
     GetWindowRect(handle, out rect); 
Cuestiones relacionadas