我有一个窗口显示另一个进程何时完成。另一个进程在完成时设置一个布尔标志 - 返回该标志状态的函数被传递到窗口(这是 _signalCompletedFunction 引用的函数)。窗口“winWait”仅显示循环进度条(等待时从 1 反复移动到 10)。问题是进度条永远不会更新。 (类似的代码适用于 WinForms,其中“OnLoaded”被 WinForms“OnActivated”替换,但还需要 WinForms 进度条“Refresh”方法 - 此方法在 Avalonia 中不存在)。
public partial class winWait : Window
{
private readonly Func<bool> _signalCompletedFunction;
public winWait()
{
InitializeComponent();
}
public winWait(Func<bool> signalCompletedFunction) : this()
{
_signalCompletedFunction = signalCompletedFunction;
this.prgWait.Minimum = 0;
this.prgWait.Maximum = 10;
}
protected override void OnLoaded(RoutedEventArgs e)
{
base.OnLoaded(e);
while (!_signalCompletedFunction())
{
double mod = (this.prgWait.Value + 1) % this.prgWait.Maximum;
this.prgWait.Value = mod == 0 ? this.prgWait.Maximum : mod;
}
this.Close();
}
}
同步
while
循环会阻塞 UI 线程,因此不会进行 UI 更新。
用这样的计时器实现替换它:
protected override void OnLoaded(RoutedEventArgs e)
{
base.OnLoaded(e);
var timer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(50)
};
timer.Tick += (s, e) =>
{
if (!_signalCompletedFunction())
{
prgWait.Value = ((prgWait.Value + 1) % (prgWait.Maximum + 1)) + prgWait.Minimum;
}
else
{
timer.Stop();
Close();
}
};
timer.Start();
}