You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# UWP拖放功能问题:10x10网格图片交换无法获取选中与目标图片

10x10 Grid拖放交换图片的实现方案

实现步骤

  • 首先在拖放启动时记录源图片对象
  • 然后在释放操作触发时计算坐标匹配目标图片
  • 最终传入两个图片对象完成交换校验

调整后的完整代码

public MainViewModel()
{
    GameGrid = new Grid { AllowDrop = true };
    GameGrid.DragOver += GameGrid_DragOver;
    GameGrid.Drop += GameGrid_Drop;

    for (int row = 0; row < 10; row++)
    {
        GameGrid.RowDefinitions.Add(new RowDefinition());
        for (int col = 0; col < 10; col++)
        {
            if (row == 0)
                GameGrid.ColumnDefinitions.Add(new ColumnDefinition());

            var image = new Image { Source = logic.GetImage(), CanDrag = true, AllowDrop = true };
            // 新增:订阅拖放启动事件
            image.DragStarting += Image_DragStarting;
            Grid.SetRow(image, row);
            Grid.SetColumn(image, col);
            GameGrid.Children.Add(image);
        }
    }
}

// 新增:拖放启动事件处理,存储源图片
private void Image_DragStarting(UIElement sender, DragStartingEventArgs args)
{
    args.Data.Properties.Add("SourceImage", sender as Image);
    args.Data.RequestedOperation = DataPackageOperation.Move;
}

private void GameGrid_DragOver(object sender, Windows.UI.Xaml.DragEventArgs e)
{
    e.AcceptedOperation = DataPackageOperation.Move;
}

private async void GameGrid_Drop(object sender, Windows.UI.Xaml.DragEventArgs e)
{
    // 读取源图片
    if (!e.DataView.Properties.TryGetValue("SourceImage", out var sourceObj) || sourceObj is not Image sourceImage)
        return;

    // 计算释放位置对应的网格行列
    Point dropPosition = e.GetPosition(GameGrid);
    double cellWidth = GameGrid.ActualWidth / 10;
    double cellHeight = GameGrid.ActualHeight / 10;
    int targetColumn = Math.Clamp((int)Math.Floor(dropPosition.X / cellWidth), 0, 9);
    int targetRow = Math.Clamp((int)Math.Floor(dropPosition.Y / cellHeight), 0, 9);

    // 查找目标位置的图片
    Image targetImage = GameGrid.Children.Cast<Image>()
        .FirstOrDefault(img => Grid.GetRow(img) == targetRow && Grid.GetColumn(img) == targetColumn);

    // 排除同一个图片的情况,执行校验
    if (targetImage != null && sourceImage != targetImage)
    {
        if (logic.IsValidSwap(sourceImage, targetImage))
        {
            // 校验通过后执行交换逻辑,此处为交换图片源,也可根据需求交换两个图片的行列位置
            var tempSource = sourceImage.Source;
            sourceImage.Source = targetImage.Source;
            targetImage.Source = tempSource;
        }
    }
}

关键说明

如果你的业务需求是交换两个图片的位置而非图片内容,只需要把交换Source的逻辑替换为交换两个Image对象的Grid.Row和Grid.Column附加属性即可。

内容的提问来源于stack exchange,提问作者OfekCatz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:39:02