Если я напишу обработчик события для события 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: Это простое приложение, чтобы показать смысл. Пожалуйста, игнорируйте любые плохие стили, такие как «не ловить исключения» и т. Д.