У меня есть форма с настраиваемым 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
}
}