为什么我无法在 canvas WPF C# 中删除图像?

Why I can't remove image in canvas WPF C#?

我的 class 在 Anobject.cs 文件中:

public class AnObject
{
    public string Name { get; set; }
    public int? X { get; set; }
    public int? Y { get; set; }
    public AnObject(string name = null, int? x = null, int? y = null)
    {
        this.Name = name;
        this.X = x;
        this.Y = y;
    }
}

还有我的页面RolePlay.xaml.cs:

readonly AnObject[,] allObjects = new AnObject[50,38];
    private void RolePlayPage_Loaded(object sender, RoutedEventArgs e)
    {
        AnObject anObject = new AnObject();
        for (int i = 0; i < 50; i++)
        {
            for (int j = 0; j < 38; j++)
            {
                allObjects[i, j] = anObject;
            }
        }

        List<string> lines = File.ReadAllLines(@"myfile.txt").ToList();
        foreach (string line in lines)
        {
            string[] data = line.Split(' ');
            string data0 = data[0];
            int data1 = int.Parse(data[1]);
            int data2 = int.Parse(data[2]);

            anObject = new AnObject(data0, data1, data2);

            allObjects[data1, data2] = anObject;
        }
    }

我用 canvas 方法创建图像:

    private void UpdateAllObjects()
    {
        foreach (AnObject obj in allObjects)
        {
            if (obj.Name != null)
            {
                Image objPic = new Image
                {
                    Name = obj.Name + obj.X.ToString() + obj.Y.ToString(),
                    Width = 20,
                    Height = 20,
                    Source = new BitmapImage(new Uri($@"Objects\{obj.Name}.png", UriKind.Relative))
                };
                Canvas.SetLeft(objPic, (double)(obj.X * 20));
                Canvas.SetTop(objPic, (double)(obj.Y * 20));
                RolePlayCanvas.Children.Add(objPic);
            }
        }
    }

我的问题出在我的 removePic 方法中:

if (allObjects[x, y].Name != null)
{
    Image picName = (Image)FindName(allObjects[x, y].Name + allObjects[x, y].X.ToString() + allObjects[x, y].Y.ToString());
    RolePlayCanvas.Children.Remove(picName);
    // Canvas.SetLeft(picName, 0);
    allObjects[x, y].Name = null;
}

为什么没有从 canvas 中删除 picName? 尝试执行此“Canvas.SetLeft(picName, 0);”行会出现错误:System.ArgumentNullException: 'Value cannot be null'.

您的查询可能失败了。尝试调试此代码以确定 element 是否实际设置为要删除的 Image 元素:

var obj = allObjects[x, y];
if (obj != null)
{
    var name = obj.Name + obj.X.ToString() + obj.Y.ToString();
    var element = RolePlayCanvas.Children.OfType<Image>().FirstOrDefault(x => x.Name == name);
    if (element != null)
        RolePlayCanvas.Children.Remove(element);
}