簡體   English   中英

BackgroundWorker:在用戶控件之間切換后,在完成事件中啟用/禁用按鈕不起作用

[英]BackgroundWorker: Enabling/Disabling Buttons in Completed Event not working after switching between UserControls

我將BackgroundWorker放在UserControl遇到問題。 我的WPF應用程序的左側有一個導航,每個條目都加載自己的UserControl ,用戶可以在其中生成PDF文件。

由於創建PDF需要花費一些時間,因此我已經實現了可以完成此工作的BackgroundWorker ,此外,我還禁用了一些按鈕並顯示進度條。 RunWorkerCompleted事件中,我重置了按鈕的狀態並隱藏了進度條。

盡管有一種情況,所有這些工作都非常好:在PDF創建運行時,用戶可以在UserControls之間切換,並且如果他返回開始工作的控件,則控件應顯示進度欄和禁用的按鈕。 為此,我向UserControl添加了一個變量(isProcessing)。

控件的構造函數我有這個:

        // Check if a current process is running, if so: handle button/progressbar visibility
        if (_isProcessing)
        {
            _stkProgressBar.Visibility = Visibility.Visible;
            progressBar1.IsIndeterminate = true;

            // Disabling the buttons here is just working with a hack in
            // the "Button_IsEnabledChanged" event.
            btnDaten.IsEnabled = false;
            btnBericht.IsEnabled = false;
            this.Cursor = Cursors.Wait;
        }
        else
        {
            _stkProgressBar.Visibility = Visibility.Hidden;
        }

啟用/禁用按鈕只是因為這個骯臟的黑客而起作用:

    private void btnDaten_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        //HACK: We want to disable the report buttons if a report execution is running.
        //      Disabling the buttons in the Load Event of the control isn't working
        if (_isProcessing && (bool)e.NewValue)
        {
            btnDaten.IsEnabled = false;
            btnBericht.IsEnabled = false;
        }
    }

現在,如果作業正在運行並且用戶在控件之間切換,則處理控件的狀態很好。 但是,如果作業結束並且PDF就緒,則無法啟用按鈕,並且進度條也保持可見。 代碼放置在RunWorkerCompleted事件中:

    void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // This is not working if the user switches between the controls
        _isProcessing = false;
        this.Cursor = Cursors.Arrow;
        _stkProgressBar.Visibility = Visibility.Hidden;
        btnDaten.IsEnabled = true;
        btnBericht.IsEnabled = true;
    }

我對其進行了調試,發現按鈕獲得了正確的輸入,因此應該將其啟用,但是什么也沒有發生。 如果用戶停留在開始作業的控件中,則按鈕和進度欄的狀態將正確重置。

是的,這里是用戶控件之間的切換。 當您切換並返回時,將創建控件的實例。 這將創建BackgroundWorker的實例。 具有不與實際運行的BGW關聯的RunWorkerCompleted事件處理程序。

您的代碼中還有另一個錯誤,當原始的BGW實例完成工作並設置(現在不可見)控件屬性時,這應該使ObjectDisposedException導致程序崩潰。 您忘了在用戶控件之間切換時調用它們的Dispose()。 不太確定如何在WPF中完成此操作,但在winforms中這是無法插拔的漏洞。

只要您要支持切換,就必須對此有所不同。 BGW實例需要與用戶控制實例分開,這樣它才能在交換機中幸存下來。 相當痛苦的是,在創建和處理控件時,您必須連接和取消連接事件,您肯定需要重寫Dispose()方法,並且不要忘記調用它。 如果只允許BGW一次運行一次,則使BGW靜態是有道理的。 這應該是正常的。 堆疊用戶控件,這樣您就只能創建一次,這是一個Q&D修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM