我有一个视图,其中包含一个绑定到此属性的图像控件:
private System.Drawing.Image _sigImage;
public System.Drawing.Image sigImage
{
get { return _sigImage; }
set { _sigImage = value; RaisePropertyChanged(); }
}
我正忙于使用mvvm实现签名板,并希望签名显示在图像控件中。但是我无法显示它。
芯片签名板的代码为:
DynamicCapture dc = new DynamicCaptureClass();
DynamicCaptureResult res = dc.Capture(sigCtl, "Who", "Why", null, null);
if (res == DynamicCaptureResult.DynCaptOK)
{
sigObj = (SigObj)sigCtl.Signature;
sigObj.set_ExtraData("AdditionalData", "C# test: Additional data");
try
{
byte[] binaryData = sigObj.RenderBitmap("sign", 200, 150, "image/png", 0.5f, 0xff0000, 0xffffff, 10.0f, 10.0f, RBFlags.RenderOutputBinary | RBFlags.RenderColor32BPP) as byte[];
using (MemoryStream memStream = new MemoryStream(binaryData))
{
System.Drawing.Image newImage = System.Drawing.Image.FromStream(memStream);
sigImage = newImage;
// work with image here.
// You'll need to keep the MemoryStream open for
// as long as you want to work with your new image.
memStream.Dispose();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
图像以位图的形式存储在变量newImage中。
如何将图像绑定到sigImage的图像控件?
答案 0 :(得分:1)
System.Drawing.Image
不是Image元素的Source
属性的适当类型。是WinForms,不是WPF。
改为使用System.Windows.Media.ImageSource
private ImageSource sigImage;
public ImageSource SigImage
{
get { return sigImage; }
set { sigImage = value; RaisePropertyChanged(); }
}
,然后将BitmapImage或BitmapFrame分配给直接从MemoryStream创建的属性。必须设置BitmapCacheOption.OnLoad
才能在解码位图后立即关闭流。
var bitmapImage = new BitmapImage();
using (var memStream = new MemoryStream(binaryData))
{
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = memStream;
bitmapImage.EndInit();
}
bitmapImage.Freeze();
SigImage = bitmapImage;
如果将具有SigImage
属性的类的实例分配给视图的DataContext,则绑定将如下所示。
<Image Source="{Binding SigImage}"/>
由于WPF具有从string
,Uri
和byte[]
到ImageSource
的内置类型转换,因此您最好将源属性声明为byte[]
private byte[] sigImage;
public byte[] SigImage
{
get { return sigImage; }
set { sigImage = value; RaisePropertyChanged(); }
}
并分配一个值,例如
SigImage = binaryData;
无需手动创建BitmapImage或BitmapFrame或更改绑定。