Обновление объектов интерфейса в формах Windows - PullRequest
5 голосов
/ 09 марта 2010

Pre .net Я использовал MFC, ON_UPDATE_COMMAND_UI и класс CCmdUI для обновления состояния моего пользовательского интерфейса Windows. Из старой версии MFC / Win32:

Как правило, пункты меню и кнопки панели инструментов имеют более одного состояния. За Например, пункт меню отображается серым цветом (затемненный), если он недоступен в настоящий контекст. Пункты меню также могут быть проверенным или непроверенным. Панель инструментов Кнопка также может быть отключена, если недоступен, или его можно проверить.

Кто обновляет состояние этих предметов как меняются условия программы? Логично, если пункт меню генерирует команда, которая обрабатывается, скажем, документ, имеет смысл иметь документ обновить пункт меню. документ, вероятно, содержит информация о том, какое обновление на основе.

Если команда имеет несколько объекты пользовательского интерфейса (возможно, меню пункт и кнопка панели инструментов), оба направляется к той же функции обработчика. Это инкапсулирует ваш пользовательский интерфейс обновить код для всех эквивалентных объекты пользовательского интерфейса в одном место.

Каркас обеспечивает удобный интерфейс для автоматического обновления объекты пользовательского интерфейса. Ты можешь выбрать сделать обновление другим способом, но предоставленный интерфейс эффективный и простой в использовании.

Какое руководство для .net Windows Forms? Я использую обработчик Application.Idle в основной форме, но не уверен, что это лучший способ сделать это. Когда я поместил все свои обновления пользовательского интерфейса в обработчик событий Idle, мое приложение начало показывать некоторые проблемы с производительностью, и у меня пока нет метрик, чтобы это отследить. Не уверен, что это связано.

Ответы [ 3 ]

1 голос
/ 09 марта 2010

AFAIK, в стандартном мире .NET System.Windows.Forms эта функциональность недоступна из коробки. На эту проблему можно ответить несколькими способами. Ссылки ниже являются полезными ресурсами:

OnUpdate эквивалент

ActionLists для форм Windows

Интерфейс команды Обновление форм Windows в C #

1 голос
/ 09 марта 2010

Мне было проще всего, чтобы обработчик событий элемента меню порождал фоновый поток, который отключает элемент меню, выполняет работу, а затем снова включает элемент меню. Таким образом, пользовательский интерфейс доступен для обработки других запросов пользовательского интерфейса, и мне не нужно запрашивать информацию о завершении операции.

Я обычно включаю логику, которая предотвращает одновременное выполнение нескольких операций, использующих одни и те же ресурсы. Это означает создание функции для одновременного отключения / включения всех похожих ресурсов. например Я мог бы разрешить выполнять только одну файловую операцию за раз, поэтому я бы создал функцию для отключения / включения всех пунктов меню, связанных с файловыми операциями, и вызывал ее из каждого из этих пунктов меню.

0 голосов
/ 09 марта 2010

Просто поменяйте их собственность, например

obj.Enabled = true;

или

obj.Enabled = false;

Свойство этого объекта автоматически вызовет для вас .Invalidate() или .Refresh(), поэтому элемент управления должен автоматически перекрашиваться.

Если вы хотите выполнить БОЛЬШУЮ задачу, которая бы блокировала пользовательский интерфейс на несколько секунд, стоит использовать Threads + Делегаты .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...