【解決方法】WPF での処理中にプログレス バーの値を更新する


下の図のように、COM/USB ポートで複数のデバイスとの接続を確認するために使用される画面があります。
https://i.stack.imgur.com/CAjK0.png[^]

デバイス接続の確認が終了した場合にユーザーが[デバイスの確認]ボタンをクリックすると、コンボボックスの横にアイコンが表示され、進行状況バーがデバイスの合計に基づいて値を更新します。 たとえば、4 つのデバイスがある場合、進行状況バーは、チェック後に 25%、50%、75%、100% と更新されます。

私が試したこと:

PropertyChanged を使用して値を更新しようとしましたが、機能していないようです。 ボタンをクリックすると、進行状況バーが表示されますが、値は常に 100 です。また、cs ファイルに INotifyPropertyChanged を実装します。 これで私を助けてください!
これが私のコードです:

XAML:

XML
<ProgressBar x:Name="pgProcessing" Visibility="Collapsed" Minimum="0" Maximum="100" Value ="{Binding Percent, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>

コードビハインド:

C#
private double _percent;
public double Percent
    {
        get { return _percent; }
        set { _percent = value; OnPropertyChanged("Percent"); }
    }

public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

private void BtnCheck_Click(object sender, RoutedEventArgs e)
    {
        pgProcessing.Visibility = Visibility.Visible;
        _percent = 0;
        this.Percent = _percent;

        // Do check connection 1st device
        // End

        _percent = (100 * currentDevice) / TOTAL_DEVICE;
        this.Percent = _percent; //50%

        // Do check connection 2nd device
        // End

        _percent = (100 * currentDevice) / TOTAL_DEVICE;
        this.Percent = _percent; //100%
    }

私のコンストラクタ:

C#
public HealthCheck()
        {
            InitializeComponent();
            this.DataContext = this;
        }

解決策 1

これを変える:

C#
_percent = (100 * currentDevice) / TOTAL_DEVICE;
this.Percent = _percent; //100%

これに:

C#
this.Percent = (100 * currentDevice) / TOTAL_DEVICE;

アップデート

コード ビハインドにバインドしているため、INotifyPropertyChanged は必要ありません。 コントロールに名前を付けて、直接更新します。

また、UI スレッドで直接作業しているため、UI を更新する時間がありません。

解決策 2

長時間実行されるコードを UI スレッドから 2 番目のスレッドに移動します。 BackgroundWorker クラス (System.ComponentModel) | マイクロソフト ラーン[^] 使いやすく、進行状況を UI スレッドに報告できるので、良い候補です。

コメント

タイトルとURLをコピーしました