Обновление пользовательского интерфейса было в моем случае, чтобы просто очистить метки (см. UpdateInterface ()). Однако я обнаружил «ошибку». Это был файл ".jpg" и BackgroundImage, который я загружал при каждом обновлении. Хотя это было «просто» 1280x1024, это было слишком много для обновления интерфейса.
Когда я очистил Изображения, обновление было немедленно.
Мое решение сейчас:
this.BackgroundImage = ((System.Drawing.Image(resources.GetObject("$this.BackgroundImage")));
this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer | System.Windows.Forms.ControlStyles.AllPaintingInWmPaint, true);
в Form1.Designer.cs
и Приостановка и возобновление макета со следующим классом (который я нашел где-то в Интернете)
public static class ControlHelper
{
#region Redraw Suspend/Resume
[DllImport("user32.dll", EntryPoint = "SendMessageA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private const int WM_SETREDRAW = 0xB;
public static void SuspendDrawing(this Control target)
{
SendMessage(target.Handle, WM_SETREDRAW, 0, 0);
}
public static void ResumeDrawing(this Control target) { ResumeDrawing(target, true); }
public static void ResumeDrawing(this Control target, bool redraw)
{
SendMessage(target.Handle, WM_SETREDRAW, 1, 0);
if (redraw)
{
target.Refresh();
}
}
#endregion
}
Также я изменил файлы ".jpg" на файлы ".bmp". Теперь интерфейс работает плавно и быстро.
И @Jesting:
Не уверен, что это на самом деле: this.BackgroundImage = BackgroundWelcome; но действительно ли необходимо каждый раз назначать такие статические данные?
Нет, я мог бы найти лучшее решение. Однако, поскольку приложение очень маленькое, и у меня есть только четыре фоновых изображения, мне было проще «жестко закодировать» его.
Наконец, тег (-reader) на самом деле не был проблемой.
И для обновления пользовательского интерфейса я использую эту довольно простую функцию:
private void UpdateInterface(PassportDatabaseReader.Passport _passport)
{
if (InvokeRequired)
{
this.BeginInvoke(new Action<PassportDatabaseReader.Passport>(UpdateInterface), new object[] { _passport });
return;
}
else
{
ControlHelper.SuspendDrawing(this);
new Thread(() => ChangeBackground(BackgroundPassport)).Start();
lPassportNumberNo.Text = _passport.PassportNo;
strPassportNo = _passport.PassportNo;
lPassengerName.Text = _passport.Name.Replace('$','\n');
lPax.Text = _passport.Pax;
lTableNo.Text = _passport.TableNo;
lRoomNo.Text = _passport.RoomNo;
pbTables.Hide();
try
{
pbPasspic.Load("..\\..\\Pics\\" + _passport.PassportNo + ".png");
pbPasspic.Show();
pbTables.ImageLocation = "..\\..\\Tischordnung_" + _passport.TableNo + ".png";
pbTables.Show();
}
catch (Exception)
{
throw;
}
ControlHelper.ResumeDrawing(this);
}
}
Приложение представляет собой считыватель "свадебного паспорта", который отображает на экране имя, номер комнаты для гостей, номер стола, а также изображение "паспорта".