所以我在視圖中有一個影像,它系結到 ViewModel 中的位元組陣列。
<Image
Source="{ Binding InputImage, Converter={StaticResource imageConvertor}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Panel.ZIndex="1"
x:Name="UploadImage"
Grid.Column="0"
Grid.Row="0"
Stretch="Uniform"
Margin="5"
/>
private byte[] inputImage;
public byte[] InputImage
{
get { return inputImage; }
set
{
inputImage = value;
OnPropertyChanged(nameof(InputImage));
}
}
用戶通過執行此命令的按鈕從失敗中上傳影像
OpenFileDialog op = new OpenFileDialog();
op.Title = "Select a picture";
op.Filter = "All supported graphics|*.jpg;*.jpeg;*.png|"
"JPEG (*.jpg;*.jpeg)|*.jpg;*.jpeg|"
"Portable Network Graphic (*.png)|*.png";
if (op.ShowDialog() == true)
{
UploadImage.Source = new BitmapImage(new Uri(op.FileName));
}
問題是當我嘗試上傳影像時,轉換器接收 null 作為引數。如果我從 xaml 檔案中的系結中洗掉轉換器,它會成功上傳到視圖,但無法系結到 ViewModel 中的屬性。
這是轉換器的實作
public class ByteArrayToBitmapImageConverter : IValueConverter
{
public object Convert(object? value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return null;
}
else
return ToImage(value as byte[]);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
{
return null;
}
else
return ToBinary(value as Image);
}
public static Image ToImage(Byte[] binary)
{
Image image = null;
if (binary == null || binary.Length < 100) return image;
using (MemoryStream ms = new MemoryStream(binary))
{
image = Image.FromStream(ms);
}
return image;
}
public static Byte[] ToBinary(Image image)
{
if (image == null) return null;
using (MemoryStream memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Png);
return memoryStream.ToArray();
}
}
}
什么導致空輸入
uj5u.com熱心網友回復:
您正在使用 WinForms Image 類而不是 WPF BitmapSource。BitmapSource 是 ImageSource 的子類,它是 Image 元素Source屬性的型別。
您的轉換器應如下所示:
public class ByteArrayToBitmapImageConverter : IValueConverter
{
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
return ToBitmapSource(value as byte[]);
}
public object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture)
{
return ToByteArray(value as BitmapSource);
}
public static BitmapSource ToBitmapSource(byte[] buffer)
{
if (buffer == null)
{
return null;
}
using (var stream = new MemoryStream(buffer))
{
return BitmapFrame.Create(
stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
}
public static byte[] ToByteArray(BitmapSource bitmap)
{
if (bitmap == null)
{
return null;
}
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
using (var stream = new MemoryStream())
{
encoder.Save(stream);
return stream.ToArray();
}
}
}
然而,直接將位元組陣列分配給視圖模型屬性可能要簡單得多,例如
viewModel.InputImage = File.ReadAllBytes(op.FileName);
您根本不需要您的轉換器,因為由于內置型別轉換,該Image.Source屬性可以直接系結到 type 的源屬性string,Uri并且byte[](除了ImageSource)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480448.html
