Индикатор выполнения не меняет состояние (цвет) при отображении окна сообщения - PullRequest
0 голосов
/ 27 мая 2020

У меня есть форма с настраиваемым StyledProgressBar. Этот StyledProgressBar просто добавляет параметр State для установки цвета индикатора выполнения. При нормальных обстоятельствах индикатор выполнения работает так, как ожидалось, но если стиль индикатора выполнения был Marquee, Value = Minimum = 0 и Maximum = 1, и я запускаю следующий код

progressBar.Style = ProgressBarStyle.Continuous;
progressBar.Value = progressBar.Maximum;
progressBar.State = ProgressBarState.Error;
MessageBox.Show(this, "An error occurred", "Program", MessageBoxButtons.OK, MessageBoxIcon.Error);

Затем цвет индикатора выполнения остается зеленым, а не становится красным. Если я прерву свою программу до вызова MessageBox.Show или вместо прерывания поставлю Thread.Sleep(1000);, тогда цвет индикатора выполнения изменится на красный, как и ожидалось.

Почему отображение окна сообщения блокирует индикатор выполнения от изменения цвета даже после закрытия окна сообщения? Могу ли я что-то сделать (помимо добавления сна, что не является правильным исправлением), чтобы убедиться, что индикатор выполнения меняет состояние?

Для справки, вот код для класса StyledProgressBar:

using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices;

namespace System.Windows.Forms
{
    [ToolboxBitmap(typeof(ProgressBar))]
    public class StyledProgressBar : ProgressBar
    {
        private const int PBM_SETSTATE = 0x410;
        private ProgressBarState m_State = ProgressBarState.Normal;

        //
        // Summary:
        //     Gets or sets the color in which progress should be indicated on the progress
        //     bar.
        //
        // Returns:
        //     One of the System.Windows.Forms.ProgressBarState values. The default is System.Windows.Forms.ProgressBarState.Normal
        //
        // Exceptions:
        //   T:System.ComponentModel.InvalidEnumArgumentException:
        //     The value is not a member of the System.Windows.Forms.ProgressBarState enumeration.
        [Browsable(true)]
        [DefaultValue(ProgressBarState.Normal)]
        [EditorBrowsable(EditorBrowsableState.Always)]
        [Description("This property allows the user to set the state of the ProgressBar."), Category("Behavior")]
        public ProgressBarState State
        {
            get { return m_State; }
            set
            {
                switch (value)
                {
                    case ProgressBarState.Normal:
                    case ProgressBarState.Error:
                    case ProgressBarState.Paused:
                        m_State = value;
                        OnStateChanged(EventArgs.Empty);
                        break;
                    default:
                        throw new InvalidEnumArgumentException("The value is not a member of the System.Windows.Forms.ProgressBarState enumeration.");
                }
            }
        }

        protected virtual void OnStateChanged(EventArgs e)
        {
            // set the progress bar state (Normal, Error, Paused)
            if (Style != ProgressBarStyle.Marquee) SendMessage(Handle, PBM_SETSTATE, (int)m_State, 0);
        }

        protected override void OnStyleChanged(EventArgs e)
        {
            base.OnStyleChanged(e);

            // set the progress bar state (Normal, Error, Paused)
            if (Style != ProgressBarStyle.Marquee) SendMessage(Handle, PBM_SETSTATE, (int)m_State, 0);
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        internal static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
    }

    public enum ProgressBarState
    {
        /// <summary>
        /// Indicates normal progress
        /// </summary>
        Normal = 1,

        /// <summary>
        /// Indicates an error in the progress
        /// </summary>
        Error = 2,

        /// <summary>
        /// Indicates paused progress
        /// </summary>
        Paused = 3
    }
}

1 Ответ

0 голосов
/ 27 мая 2020

Добавление

Application.DoEvents(); 

перед MessageBox решит проблему. См. Доказательства этого ниже.

enter image description here

enter image description here

Есть ли что-нибудь еще в вашей программе или окружение, которым вы будете sh поделиться?

...