Сбой WPF NotifyIcon при первом запуске — корневой визуал VisualTarget не может иметь родителя

Обновление: проблема появилась в .NET 4.5.2. Проблема не возникает ни с 4.5.1, ни с 4.5.

У меня странная проблема, у меня проблемы с отладкой. У нас есть приложение WPF, созданное поверх NotifyIcon, созданного Филиппом Суми. http://www.codeproject.com/Articles/36468/WPF-NotifyIcon http://www.hardcodet.net/wpf-notifyicon

Мы используем версию от nugget:

<package id="Hardcodet.NotifyIcon.Wpf" version="1.0.5" targetFramework="net45" />

Проблема в том, что при первом (и только первом) запуске приложения происходит сбой со следующим исключением. Его легко воссоздать, наведя указатель мыши на значок на панели задач, когда он появится. При последующих запусках проблем нет. Приложение не имеет сохраненного состояния или постоянных данных. Я не знаю никакой разницы между первым и последующими запусками. Однако во второй раз он запускается намного быстрее. Та же проблема возникает в примере приложения без окон, которое поставляется с NotifyIcon.

Сообщение об исключении и трассировка стека


person denver    schedule 03.03.2015    source источник
comment
Поскольку у вас есть исходный код этого компонента, вы можете попробовать решить свою проблему самостоятельно. Просто запустите сеанс отладки и поймайте это исключение в отладчике. Осмотрите соответствующие объекты. Возможно, в компоненте есть ошибка, поэтому вы могли бы написать об этом автору или предложить решение.   -  person dymanoid    schedule 05.03.2015
comment
@dymanoid Работал над этим. Проблема возникает при установке для свойства ToolTip.IsOpen значения true. Свойство вызывает исключение ArgumentException. Я не нашел ничего неправильного в исходном коде компонента.   -  person denver    schedule 05.03.2015
comment
если (_notificationWindow.Visibility == Visibility.Visible) вернуть; исправил эту проблему для меня. Я показываю окно, которое является дочерним элементом значка уведомления (_notificationWindow) сразу после этого.   -  person CRice    schedule 05.09.2016


Ответы (3)


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

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

[STAThread]
static void Main()
{
    ToolTip tt = new ToolTip();
    tt.IsOpen = true;
    tt.IsOpen = false;
...
}

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

person denver    schedule 10.03.2015
comment
Ребята, вы когда-нибудь это понимали? - person Boumbles; 30.03.2016
comment
@Boumbles Нет. Мы выпустили приложение с этим обходным путем. Насколько я знаю, проблем не было. - person denver; 05.04.2016

У меня точно такая же проблема. К сожалению, я не могу воспроизвести такое поведение, но у меня есть другая программа, использующая эту библиотеку, которая отлично работает. Таким образом, основное отличие состоит в том, что рабочая программа не только использует свойство ToolTipText в части XAML, но также предоставляет UIElement для свойства TrayToolTip.

<hc:TaskbarIcon.TrayToolTip>
    <CustomUIElement/>
</hc:TaskbarIcon.TrayToolTip>

Так что, возможно, это может быть альтернативным обходным путем.

(Извините за все отмененные комментарии, только что выяснил, что блоки кода не поддерживаются в комментариях)

person Cray    schedule 18.03.2015

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

internal System.Windows.Forms.NotifyIcon ni = new System.Windows.Forms.NotifyIcon();
....
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
  ni.Icon = Null;
}

Теперь я скрываю значок Window_Closing, используя: (иначе значок остается в области нитификации)

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
   ni.Visible = false;
}

Кстати: использование «ToolTip-solution» добавило моему приложению больше 10-секундного времени запуска.

person Kasper Halvas Jensen    schedule 22.09.2015