gpt4 book ai didi

c# - 在图像查看和编辑 WPF 上共享冲突

转载 作者:行者123 更新时间:2023-12-03 10:36:00 29 4
gpt4 key购买 nike

我正在处理 MVVMWPF应用。我有一个场景,我必须编辑查看图像并保存它。

我用过RadCarousel其中使用ContextMenu右键单击我正在使用 mspaint 编辑图像.当我尝试保存编辑后的图像时,我得到“Sharing violation error on path”。

图像位于共享文件夹中。

//XAML 代码:

    <telerik:RadCarousel x:Name="MarketSeriesCarousel" 
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
ItemsSource="{Binding Path=MarketSeriesImageList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}"
SelectedItem="{Binding SelectedMarketSeriesImage, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}"
Background="Transparent"
HorizontalScrollBarVisibility="Auto"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Auto"
telerik:StyleManager.Theme="Windows8"
Focusable="True"
PropertyChanged="MarketSeriesCarousel_PropertyChanged">
<telerik:RadCarousel.ContextMenu>
<ContextMenu >
<MenuItem Header="Edit" Command="{Binding EditImage}" CommandParameter="{Binding }"/>
<MenuItem Header="MetaData" IsEnabled="False"/>
<MenuItem Header="Delete" Command="{Binding DeleteImage}"/>
</ContextMenu>

</telerik:RadCarousel.ContextMenu>

<telerik:RadCarousel.ItemsPanel>
<ItemsPanelTemplate>
<telerik:RadCarouselPanel Path="{StaticResource path}"
telerik:StyleManager.Theme="Windows8" >
</telerik:RadCarouselPanel>
</ItemsPanelTemplate>
</telerik:RadCarousel.ItemsPanel>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding ViewSeriesImage}" />
</i:EventTrigger>

</i:Interaction.Triggers>
</telerik:RadCarousel>

// View 模型代码:
/// <summary>
/// Edit image viewer.
/// </summary>
private void EditImageViewer()
{
try
{

ProcessStartInfo startInfo = new ProcessStartInfo(ImagePath);
startInfo.Verb = "edit";
Process proc = Process.Start(startInfo);

}
catch (Exception ex)
{
// Error handling.

throw new ApplicationException(ex.Message);
}
}

我可以实现这一目标的任何可能方式?或图像编辑的任何替代方案。

但我需要 mspaint 中的所有功能.

最佳答案

您收到此错误是因为您的 wpf 应用程序保持图像文件锁定,因为您实际上是在引用它。
要解决此问题,请创建同一文件的内存位图图像。我使用以下代码也使用 mvvm :

public BitmapImage Image
{
get
{
if (!image_retrieved) getImageAsync();
return _Image;
}
}

private async Task getImageAsync()
{
image_retrieved = true;
_Image = await ImageFactory.CreateImageAsync(ImageFullPath).ConfigureAwait(true);
this.OnPropertyChanged(() => Image);
}

public static async Task<BitmapImage> CreateImageAsync(string filename)
{
if (!string.IsNullOrEmpty(filename) && File.Exists(filename))
{
try
{
byte[] buffer = await ReadAllFileAsync(filename).ConfigureAwait(false);
System.IO.MemoryStream ms = new System.IO.MemoryStream(buffer);
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.StreamSource = ms;
image.EndInit();
image.Freeze();
return image;
}
catch
{
return null;
}
}
else return null;
}

static async Task<byte[]> ReadAllFileAsync(string filename)
{
try
{
using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
{
byte[] buff = new byte[file.Length];
await file.ReadAsync(buff, 0, (int) file.Length).ConfigureAwait(false);
return buff;
}
}
catch
{
return null;
}
}

然后更改您的绑定(bind)以绑定(bind)到 Image 属性。
如果您不需要在您的 gui 线程中执行此操作,它会异步创建图像。

关于c# - 在图像查看和编辑 WPF 上共享冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29097171/

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