在视图模型Wpf中设置图像控制源

时间:2020-09-09 12:28:43

标签: wpf mvvm

我有一个视图,其中包含一个绑定到此属性的图像控件:

   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的图像控件?

1 个答案:

答案 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具有从stringUribyte[]ImageSource的内置类型转换,因此您最好将源属性声明为byte[]

private byte[] sigImage;

public byte[] SigImage
{
    get { return sigImage; }
    set { sigImage = value; RaisePropertyChanged(); }
}

并分配一个值,例如

SigImage = binaryData;

无需手动创建BitmapImage或BitmapFrame或更改绑定。

相关问题