Хобрук: Ваш путь к мастерству в программировании

WPF: окно остается минимизированным даже при явной настройке WindowState

У моего приложения есть значок на панели задач, который при двойном щелчке скрывает или показывает окно приложения. Моя проблема в том, что я не могу вывести окно на передний план, если оно было в свернутом состоянии, когда было скрыто.

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

Код ниже должен делать именно это, но по какой-то причине этого не происходит:

private void TrayIcon_DoubleClick(object sender, EventArgs e)
{
    if (this.Visibility == Visibility.Hidden)
    {
        this.Visibility = Visibility.Visible;
        this.WindowState = WindowState.Normal;
        this.Activate();
    }
    ...
}

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


Ответы:


1

Я разместил свой вопрос на форумах MSDN и там ответили. Процитирую ответ:


Некоторые свойства в Window, которые больше похожи на методы, в том смысле, что они вызывают сложные действия, должны произойти после того, как предыдущее действие уже завершилось. Один из способов добиться этого - использовать Dispatcher.BeginInvoke. Если вы измените свой код, чтобы он выглядел так, он должен работать:

if (this.Visibility == Visibility.Hidden)
{
    this.Visibility = Visibility.Visible;
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,
        new Action(delegate()
        {
            this.WindowState = WindowState.Normal;
            this.Activate();
        })
    );
}

Я попробовал это, и это устранило проблему для меня. Кроме того, я думаю, вы также можете опустить this.Activate().

06.03.2010
  • Хорошо, это решает проблему, но это отстой, не правда ли? Я имею в виду, как вы должны знать, можете ли вы использовать собственность или нет? Я нахожу это очень странным ... 20.09.2011
  • У меня тоже сработало, спасибо. Мне очень неприятно, что мне пришлось заключить простое изменение свойства в этот многословный беспорядок. Я ожидаю, что фреймворк справится с этой сложностью изнутри. 02.06.2018

  • 2

    Я нашел способ получше. Поскольку проблема возникает при изменении видимости окна и состояния окна, я меняю свойство ShowInTaskBar вместо Visibility. В любом случае свернутое окно с ShowInTaskBar = true похоже на скрытое окно.

    20.09.2011

    3

    С точки зрения пользователя Щелкните свернутый значок. После этого должен отобразиться список всех экземпляров приложения. щелкните правой кнопкой мыши член этого списка и выберите развернуть. Обратите внимание, что щелчок правой кнопкой мыши по свернутому значку вызовет меню с опцией закрытия. Чтобы получить опцию «Развернуть», вам нужно щелкнуть правой кнопкой мыши список, который появляется, когда вы щелкаете значок.

    25.07.2015
    Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..