A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

103 lines
3.3 KiB

using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Interactivity;
namespace IntegrationTestApp.Pages;
public partial class DragDropPage : UserControl
{
public DragDropPage()
{
InitializeComponent();
// Set up drag-drop event handlers
AddHandler(DragDrop.DragOverEvent, DropTarget_DragOver);
AddHandler(DragDrop.DropEvent, DropTarget_Drop);
}
private async void DragSource_PointerPressed(object? sender, PointerPressedEventArgs e)
{
if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)
{
var dragData = new DataTransfer();
dragData.Add(DataTransferItem.CreateText("TestDragData"));
DragDropStatus.Text = "Dragging...";
var result = await DragDrop.DoDragDropAsync(e, dragData, DragDropEffects.Copy | DragDropEffects.Move);
DragDropStatus.Text = result switch
{
DragDropEffects.Copy => "Copied",
DragDropEffects.Move => "Moved",
DragDropEffects.None => "Cancelled",
_ => $"Result: {result}"
};
}
}
private void DropTarget_DragOver(object? sender, DragEventArgs e)
{
// Only handle events for the drop target
if (e.Source != DropTarget && !IsChildOf(e.Source as Visual, DropTarget))
return;
e.DragEffects = DragDropEffects.Copy;
// Get the position relative to the drop target
var position = e.GetPosition(DropTarget);
DropPosition.Text = $"DragOver: ({position.X:F0}, {position.Y:F0})";
}
private void DropTarget_Drop(object? sender, DragEventArgs e)
{
// Only handle events for the drop target
if (e.Source != DropTarget && !IsChildOf(e.Source as Visual, DropTarget))
return;
// Get the position relative to the drop target
var position = e.GetPosition(DropTarget);
DropPosition.Text = $"Drop: ({position.X:F0}, {position.Y:F0})";
// Check if the position is within reasonable bounds of the drop target
var bounds = DropTarget.Bounds;
var isWithinBounds = position.X >= 0 && position.X <= bounds.Width &&
position.Y >= 0 && position.Y <= bounds.Height;
var text = e.DataTransfer.TryGetText();
if (text != null)
{
DropTargetText.Text = isWithinBounds
? $"Dropped: {text} at ({position.X:F0}, {position.Y:F0})"
: $"ERROR: Position out of bounds! ({position.X:F0}, {position.Y:F0})";
DragDropStatus.Text = isWithinBounds ? "Drop OK" : "Drop position ERROR";
}
e.DragEffects = DragDropEffects.Copy;
}
private static bool IsChildOf(Visual? child, Visual? parent)
{
if (child == null || parent == null)
return false;
var current = child.Parent as Visual;
while (current != null)
{
if (current == parent)
return true;
current = current.Parent as Visual;
}
return false;
}
private void ResetDragDrop_Click(object? sender, RoutedEventArgs e)
{
DropPosition.Text = string.Empty;
DragDropStatus.Text = string.Empty;
DropTargetText.Text = "Drop items here";
}
}