gpt4 book ai didi

c# - 无法覆盖包含在 using 语句中的文件

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:56 29 4
gpt4 key购买 nike

我正在构建一个应该执行以下操作的应用程序:

  • 用户在列表框中选择一个元素(示例: Frog )
  • 在 Canvas 上打开元素对应的图片作为背景,用户可以在 Canvas 上绘图
  • 当用户选择列表框的另一个元素时, Canvas 将保存为以未选中元素命名的图片,并添加“新建”(示例:frogNew)
  • 这个新元素被添加到列表框中,如果用户再次编辑它,它会保存在相同的名称下(例如:frogNew)

一切正常,除了我尝试以相同名称 (frogNew) 保存 Canvas 的部分。我收到一条错误消息,提示我无法保存文件,因为它已经打开。如果我的代码中没有正确关闭文件,你能告诉我在哪里吗?

private void save_picture(string name)
{
//This part takes a screenshot of the canvas, named "paintSurface"
RenderTargetBitmap rtb = new RenderTargetBitmap((int)paintSurface.RenderSize.Width, (int)paintSurface.RenderSize.Height, 96d, 96d, System.Windows.Media.PixelFormats.Default);
rtb.Render(paintSurface);
BitmapEncoder pngEncoder = new PngBitmapEncoder();
pngEncoder.Frames.Add(BitmapFrame.Create(rtb));

//If the file already exists, we add "New" to its name
var regex1 = new Regex(@"New$");
if (regex1.Match(nom).ToString() == "")
{
using (var fs = System.IO.File.OpenWrite(@"D:\Test" + name + "New.png"))
{
pngEncoder.Save(fs);
}
}
else
{
using (var fs = System.IO.File.OpenWrite(@"D:\Test" + name + ".png"))
{
pngEncoder.Save(fs);
}
}
}

private void listBox1_SelectedIndexChanged(object sender, SelectionChangedEventArgs e)
{
//When the index of listbox changes, I save the canvas in a file named after the former index
List<string> oldItemNames = new List<string>();
if (e.RemovedItems.Count != 0)
{
var oldPhoto = e.RemovedItems[0].ToString();
save_picture(oldPicture);
}
//I start a new canvas with the picture corresponding to the new index as a background
paintSurface.Children.Clear();
ImageBrush newBrush = new ImageBrush();
newBrush.ImageSource = new BitmapImage(new Uri(@"D:\Test" + listBox1.SelectedItem.ToString() + ".png", UriKind.Relative));
paintSurface.Background = newBrush;
}

知道为什么这一行“using (var fs = System.IO.File.OpenWrite(@"D:\Test"+ name + ".png"))" 总是给我这个文件已经打开的错误?我怎样才能关闭它?

最佳答案

这是因为您的文件被用作图像源的 BitmapImage 锁定了

您需要在初始化位图图像时指定BitmapCacheOption.OnLoad 选项:

BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.UriSource = new Uri(@"D:\Test" + listBox1.SelectedItem.ToString() + ".png", UriKind.Relative);
bitmapImage.EndInit();

newBrush.ImageSource = bitmapImage;

关于c# - 无法覆盖包含在 using 语句中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31541819/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com