我有WCF服务来捕获网络摄像头图像并发送给客户端,它在我的WinForms应用程序中运行良好。我决定创建WPF客户端应用程序。
我有代码:
void timer1_Tick(object sender, EventArgs e)
{
counter++;
try
{
Stream imageStream = client.GetImage();
using (MemoryStream stream = new MemoryStream())
{
imageStream.CopyTo(stream);
int size = (int)stream.Length;
cam_img.Source = BitmapFrame.Create(stream,
BitmapCreateOptions.None,
BitmapCacheOption.OnLoad);
}
System.Diagnostics.Debug.WriteLine(counter);
}
catch (System.ServiceModel.CommunicationException ex)
{
if (ex.InnerException is System.ServiceModel.QuotaExceededException)
{
}
else
{
throw ex;
}
}
catch (System.Exception ex)
{
}
}
cam_img是一个图像控件。在调试器模式下,我看到该流包含数据,但cam_img.source
在每个tick事件中都是null
。
接下来的问题是,我是否必须实现propertychanged事件以与图像进行动态绑定?或者在每个计时器中分配给cam_img.source
,这足以看到动态改变控制?
答案 0 :(得分:1)
不,您不需要PropertyChanged
,您只需在每个计时器刻度中指定cam_img.Source
属性即可。
请确保您在用户界面线程中设置cam_img.Source
,否则您将获得InvalidOperationException
类似的内容:
调用线程无法访问此对象,因为它不同 线程拥有它。
如果您的imageStream
包含数据,并且您更喜欢MemoryStream
,
那么你应该在调用stream.Seek(0, SeekOrigin.Begin);
之前调用BitmapFrame.Create
移动位置。
当前代码在创建BitmapFrame
时会导致异常,并且异常被捕获,这就是为什么cam_img.Source
永远不会被设置,并且仍然是默认的'null'值。