C# WPF图像控件不更新图像
我正在做一个项目,需要我获取一堆图像并将它们显示为视频。也就是说,我将每秒更新WPF的图像控件30次。 到目前为止没有运气C# WPF图像控件不更新图像,c#,wpf,image,wpf-controls,C#,Wpf,Image,Wpf Controls,我正在做一个项目,需要我获取一堆图像并将它们显示为视频。也就是说,我将每秒更新WPF的图像控件30次。 到目前为止没有运气 BitmapImage img = BitmapToImageSource((Bitmap)image); this.image_box.Dispatcher.Invoke(() => { //this.image_box.Source.Freeze(); this.image_box.Source = img; }); BitmapImage
BitmapImage img = BitmapToImageSource((Bitmap)image);
this.image_box.Dispatcher.Invoke(() =>
{
//this.image_box.Source.Freeze();
this.image_box.Source = img;
});
BitmapImage BitmapToImageSource(Bitmap bitmap)
{
using (MemoryStream memory = new MemoryStream())
{
bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
memory.Position = 0;
BitmapImage bitmapimage = new BitmapImage();
bitmapimage.BeginInit();
bitmapimage.StreamSource = memory;
bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
bitmapimage.EndInit();
return bitmapimage;
}
}
图像框是图像控件(wpf)。
所以,我希望这段代码能更新图像,给人一种播放视频的错觉。然而它什么也不做。我看到光标在窗口上等待
已编辑----更多信息---
我创建了一个简单的程序来检查图像是否可以在图像控制中更改。但结果是一样的。我看到等待的光标,没有图像
private void Window_Loaded(object sender, RoutedEventArgs e)
{
ImageSource s1;
ImageSource s2;
s1 = new BitmapImage(new Uri(@"IMAGE_PATH", UriKind.Absolute));
s2 = new BitmapImage(new Uri(@"IMAGE_PATH", UriKind.Absolute));
while (true)
{
try
{
if (image.Source == s1)
image.Source = s2;
else
image.Source = s1;
System.Threading.Thread.Sleep(1000);
}
catch(Exception ex)
{
MessageBox.Show("Error");
}
}
}
虽然我知道这个事实,但还是犯了同样的错误。
我们不允许在循环中更新GUI。如果我们想这样做,我们需要创建一个单独的线程。虽然我知道这个事实,但还是犯了同样的错误。
我们不允许在循环中更新GUI。如果我们想这样做,我们需要创建一个单独的线程。您的
image\u box.Dispatcher.Invoke
调用意味着在后台线程中调用BitmapToImageSource
。如果是这种情况,则必须在bitmapimage.EndInit()
之后调用bitmapimage.Freeze()
,以使其能够跨线程访问。但是,您应该有一个InvalidOperation异常。否则您的代码应该可以工作。@Clemens,“如果是这种情况,您必须在bitmapimage.EndInit()之后调用bitmapimage.Freeze(),使其可以跨线程访问。”没有帮助。到目前为止,我正在主线程中工作。然后调用是多余的。我也尝试了不调用,但没有工作。我只是在试验一些随机的东西。似乎什么都不管用。我不明白为什么。我没有看到任何错误…image\u框
实际上显示在您的UI中的某个位置?而图像
是有效的位图
?从这里显示的内容来看,您的问题无法回答。您的image\u框.Dispatcher.Invoke
调用意味着在后台线程中调用BitmapToImageSource
。如果是这种情况,则必须在bitmapimage.EndInit()
之后调用bitmapimage.Freeze()
,以使其能够跨线程访问。但是,您应该有一个InvalidOperation异常。否则您的代码应该可以工作。@Clemens,“如果是这种情况,您必须在bitmapimage.EndInit()之后调用bitmapimage.Freeze(),使其可以跨线程访问。”没有帮助。到目前为止,我正在主线程中工作。然后调用是多余的。我也尝试了不调用,但没有工作。我只是在试验一些随机的东西。似乎什么都不管用。我不明白为什么。我没有看到任何错误…image\u框
实际上显示在您的UI中的某个位置?而图像
是有效的位图
?根据你在这里所展示的,你的问题无法得到回答。