Что означает возвращаемое значение e.GetPosition (...) в DragLeave EventArgs? - PullRequest
0 голосов
/ 05 июля 2019

Если я напишу обработчик события для события DragLeave в WPF, я могу вызвать e.GetPosition(sender as IInputElement) для DragEventArgs e события. Я ожидал получить Очко относительно только что отправленного элемента управления (отправителя), но это не так. Вместо этого возвращенная точка больше похожа на точку относительно другого элемента управления, которая должна быть введена сразу после выхода из этого элемента управления.

Итак, как мне интерпретировать это возвращаемое значение e.GetPosition(...)?

EDIT:

Хорошо, вчера я реализовал пример приложения, доказывающего, что значение, возвращаемое e.GetPosition((IInputElement)sender), не может быть правильным. Смотрите ниже:

Я предполагаю, что возвращаемая позиция связана с элементом управления, введенным непосредственно после выхода из текущего, независимо от того, вызову ли я e.GetPosition(...) с текущим левым элементом управления в качестве отправителя. MainWindow.xaml:

<Window ...>
    <Canvas Background="AliceBlue" AllowDrop="True">
        <Rectangle AllowDrop="True"
                   Canvas.Left="175"
                   Canvas.Top="175"
                   Width="100"
                   Height="100"
                   Fill="Tan"
                   PreviewMouseMove="Rectangle_OnPreviewMouseMove"
                   PreviewDragLeave="Rectangle_OnPreviewDragLeave"/>
        <TextBox x:Name="GetPositionValue"/>
    </Canvas>
</Window>

Как видите, это просто Rectangle и TextBox внутри Canvas.

Rectangle используется в качестве предпочтительного простого перетаскиваемого элемента управления.

TextBox и Canvas предназначены для визуализации возвращенной позиции.

Для Drag'n'Drop Rectangle имеет события PreviewMouseMove и PreviewDragLeave, обработанные в коде следующим образом:

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Rectangle_OnPreviewMouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            DragDrop.DoDragDrop(this, new DataObject("foo"), DragDropEffects.Copy);
        }
    }

    private void Rectangle_OnPreviewDragLeave(object sender, DragEventArgs e)
    {
        var givenPoint = e.GetPosition((IInputElement)sender);
        Canvas.SetLeft(this.GetPositionValue, givenPoint.X);
        Canvas.SetTop(this.GetPositionValue, givenPoint.Y);
        this.GetPositionValue.Text = givenPoint2.ToString();
    }
}

Обработчик PreviewMouseMove предназначен только для инициализации Drag'n'Drop.

Обработчик PreviewDragLeave вызывает метод e.GetPosition(...) с отправителем (здесь прямоугольник) и сохраняет значение в givenPoint.

Чтобы показать, что givenPoint - это позиция мыши, связанная с вновь введенным элементом управления (здесь Canvas), я не только установил Text TextBox с координатами givenPoint, но и также поместил TextBox в эту позицию в Canvas.

Запустите приложение и сделайте следующее: Нажмите и удерживайте левую кнопку мыши внутри Rectangle, а затем перетащите ее к Canvas. Если оставить указатель мыши Rectangle, то TextBox с координатами givenPoint появится прямо под текущим положением указателя мыши.


Таким образом, точка, указанная в событии DragLeave, должна быть связана с Canvas, даже если я реализовал ее так, чтобы она была связана с отправителем (Rectangle).


PS: Это простое приложение, чтобы показать смысл. Пожалуйста, игнорируйте любые плохие стили, такие как «не ловить исключения» и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...