我正在处理MVVM
和WPF
申请。我有一个场景,我必须编辑观看图像并保存。
我使用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>
// ViewModel代码:
/// <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
中的所有功能。
答案 0 :(得分:1)
您收到此错误是因为您的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;
}
}
然后更改绑定以绑定到Image属性。 如果您不需要在gui线程中执行,那么它正在异步创建图像。