在 OnLoaded 方法中更改值时,ProgressBar 不更新

问题描述 投票:0回答:1

我有一个窗口显示另一个进程何时完成。另一个进程在完成时设置一个布尔标志 - 返回该标志状态的函数被传递到窗口(这是 _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();
    }
}
avaloniaui avalonia
1个回答
0
投票

同步

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.