为什么我无法在 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);
}
我的 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);
}