gpt4 book ai didi

wpf - WPF 中的 100% 响应式 UI

转载 作者:行者123 更新时间:2023-12-01 11:09:56 24 4
gpt4 key购买 nike

我有一个 WPF 应用程序,它使用一个组件,该组件在位图可用时向我的应用程序发送位图,我在传递给该组件的委托(delegate)中接收这些位图。

我为此进程创建了一个新线程,它运行良好,位图来自 MemoryStream,我只是在 Dispatcher.BeginInvoke 方法调用中从该流创建 BitmapSource 对象。获得 BitmapSource 对象后,我将它们添加到 StackPanel,以便用户可以看到可用的图像队列。到目前为止一切顺利...

问题是那些位图非常大,比如 3000x2000+ 像素,创建这些位图并添加到队列大约需要 50~ms,当执行这段代码时,BeginInvoke 调用中的 onde 会阻塞这次的 UI,导致了一个非常烦人的行为,(要重现这个,只需每 5 秒调用一次 Thread.Sleep(50))。

我该如何解决这个问题,以便用户始终响应?

谢谢!

最佳答案

您可能需要考虑两个想法:

  1. 不要在 Dispatcher.Invoke 中创建 BitmapSource。这实际上会在 UI 线程内创建它,从而减慢速度。相反,在后台线程中创建它,卡住它,然后将卡住的 BitmapSource 传递给前台线程。

  2. 根据您的应用程序,StackPanel 可能不需要完整的 3000x2000 分辨率?如果是这种情况,请考虑在卡住它们之前在后台线程中调整图像的大小。

以下代码执行上面的#1:

Window1.xaml

<Window x:Class="BitmapFrameDemo.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Image Name="image"/>
</Grid>
</Window>

Window1.xaml.cs

using System;
using System.IO;
using System.Net;
using System.Threading;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Threading;

namespace BitmapFrameDemo {

public partial class Window1 : Window {

private Thread thread = null;
private Dispatcher dispatcher = null;

private void ThreadMain() {
// obtain the image memory stream
WebRequest request = WebRequest.Create("http://stackoverflow.com/content/img/so/logo.png");
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();

// create a bitmap source while still in the background thread
PngBitmapDecoder decoder = new PngBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
BitmapFrame frame = decoder.Frames[0];

// freeze the bitmap source, so that we can pass it to the foreground thread
BitmapFrame frozen = (BitmapFrame) frame.GetAsFrozen();
dispatcher.Invoke(new Action(() => { image.Source = frozen; }), new object[] { });
}

public Window1() {
InitializeComponent();

dispatcher = Dispatcher.CurrentDispatcher;
thread = new Thread(new ThreadStart(this.ThreadMain));
thread.Start();
}
}
}

alt text http://www.freeimagehosting.net/uploads/66bdbce78a.png

关于wpf - WPF 中的 100% 响应式 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1070738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com