Как я могу определить видимость элемента управления? - PullRequest
5 голосов
/ 14 июля 2011

Как определить, является ли элемент управления видимым для пользователя?У меня есть элемент управления, который отображает состояние приложения, и я хочу, чтобы оно обновлялось (это значение должно обновляться, например, увеличивать значение индикатора выполнения или изменять свойство Text метки), только если пользователь его видит.Нет необходимости обновлять его, если пользователь свернул форму, содержащую этот элемент управления, или если другая форма перекрывает этот элемент управления.Я просто не хочу делать дополнительные вычисления, если элемент управления не виден.Кроме того, как я могу обнаружить события, которые скрывают / показывают этот элемент управления?

Ответы [ 5 ]

1 голос
/ 16 августа 2012

Похоже, что это одна из часто задаваемых тем, которая имеет много возможных решений в зависимости от контекста.

Во-первых, для справки некоторые ссылки на старые обсуждения, на которые я наткнулся во время исследования:

исходное положение: IDE для гетерогенных систем с большим количеством различного оборудования и множеством разных транспортных уровней, где некоторые работают очень медленно. Одной из функций является отображение значений памяти удаленного hw в редакторах. Типичный вариант использования - открыть> 20 редакторов, каждый из которых отображает от 1 до 100 различных значений.

Поскольку транспортные уровни ограничены в полосе пропускания, я искал решение для «приоритезации» сбора данных.

(частичное) решение: Отслеживание видимости, которое в основном управляет специализированным адаптером для самого элемента управления и каждого элемента управления предка. Адаптер обрабатывает видимость в зависимости от типа предков, т.е. для элемента управления это просто экземпляр. Видимый, для TabPage я проверяю, какая страница выбрана, ... В этом случае домашнее хозяйство менеджера состоит в том, чтобы просто отслеживать родительские изменения для всех предков, чтобы отслеживать правильные видимости.

0 голосов
/ 14 июля 2011

Как часто меняется статус? Вероятно, лучше обновлять индикатор состояния, когда состояние меняется, и не беспокоиться о видимости. Допустим, что статус меняется в среднем каждые 5 минут. Окно / элемент управления может не отображаться при изменении состояния, но может легко стать видимым задолго до следующего обновления состояния. В этом случае индикатор состояния будет неверным до следующего обновления, поскольку вы избежали изменения индикатора. Если обновление индикатора состояния не является очень дорогим, вероятно, лучше не пытаться спроецировать то, что будет делать пользователь.

Редактировать после просмотра других комментариев:

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

0 голосов
/ 14 июля 2011

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

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

В Windows нет волшебства - свойство "смотрит на меня".

0 голосов
/ 14 июля 2011

Это никогда не нужно.Windows не будет генерировать событие Paint, когда окно не видно.Если вы реализовали рисование самостоятельно, то обязательно делайте это только в событии Paint и вызывайте Invalidate (), если есть причина перекрасить.

0 голосов
/ 14 июля 2011

Посмотрите на Control.Visible и событие Control.VisibleChanged .

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