WPF Popup Control - Найти координаты X, Y - PullRequest
6 голосов
/ 12 января 2010

Я пытаюсь получить координаты X, Y всплывающего элемента управления. Я пробовал:

VisualTreeHelper.GetOffset (Всплывающее);

но возвращаемый вектор всегда содержит (0,0) для X и Y.

Родителем всплывающего окна является корень макета, представляющий собой сетку.

CustomPopupPlacementCallback также всегда возвращает 0,0 для своего параметра Point.

Цель состоит в том, чтобы позволить пользователю перетаскивать всплывающее окно в любое место на экране. Я собирался попытаться выполнить это, получив текущее положение всплывающего окна и мыши и перемещая всплывающее окно в том же направлении, что и движения мыши.

-------------------- Update -------------------- * * 1013

Крис Николь, я попробовал ваш ответ с помощью следующего кода, но все еще получаю 0,0 для 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>

Код сзади:

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));
    }
}

Ответы [ 2 ]

2 голосов
/ 13 января 2010

Не уверен, что это лучший способ выяснить это, но он работает:

GeneralTransform transform = controlToFind.TransformToAncestor(TopLevelControl);
            Point rootPoint = transform.Transform(new Point(0, 0));
1 голос
/ 02 апреля 2012

Вы должны использовать Win32 API:

добавьте это в свой класс:

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

для нахождения координат X, Y введите это в свой код (в прямоугольнике вы запросили координаты):

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

        RECT rect = new RECT();
        GetWindowRect(handle, out rect);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...