Как избежать исключения настройки Window.TaskbarItemInfo в редких ситуациях - PullRequest
0 голосов
/ 03 января 2019

В ходе тестирования моего приложения в среде AppStream AWS я столкнулся с исключением, которое возникает при взаимодействии с панелью задач (в моем случае, для установки настраиваемой всплывающей подсказки). Я смог воспроизвести его в пустом приложении WPF с таким кодом:

private void Button_Click(object sender, RoutedEventArgs e)
{
    TaskbarItemInfo = new System.Windows.Shell.TaskbarItemInfo { Description = DateTime.Now.ToLongTimeString() };
}

Запуск этого кода в AppStream дает NotImplementedException с этой трассировкой стека:

at MS.Internal.AppModel.ITaskbarList.HrInit()
at System.Windows.Window.ApplyTaskbarItemInfo()
at System.Windows.Window.OnTaskbarItemInfoChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.Window.<>c.<.cctor>b__0_0(DependencyObject d, DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
at My.App.MainWindow.Button_Click()

Я нашел этот пост, который, по-моему, та же самая основная проблема: Метод ITaskbar HrInit выдает исключение в RemoteApp . Интересно, что я протестировал приложение в RemoteApp, и оно там отлично работает. Я предполагаю, что Microsoft усовершенствовала RemoteApp с тех пор, чтобы избежать этой проблемы на своей платформе.

Кажется, что исключение возникает, когда Проводник не запущен - что имеет смысл, поскольку трудно общаться с панелью задач, когда она не существует. На самом деле, я смог воспроизвести эту же проблему, просто убив explorer.exe.

Единственное потенциальное исправление, упомянутое в этом другом вопросе , было посмотреть на SystemInformation.TerminalServerSession, чтобы определить, когда вы работаете в такой среде, и избегать использования TaskbarItemInfo. Это не работает для меня, потому что это также обнаружит нормальное подключение к удаленному рабочему столу - что является очень распространенным случаем использования для моего приложения и ситуацией, когда код работает нормально.

Единственное, о чем я мог подумать, это обернуть строку кода в блок try / catch и просто вслепую проглотить все, что может пойти не так. Это не конец света, так как приложение будет работать нормально без моей логики всплывающей подсказки на панели задач. Но это только кажется .... неправильным. Кажется, что именно такой обработчик ошибок должен заниматься WPF. Я знаю, что не запускать explorer.exe - странная вещь, но я слышал о людях, использующих альтернативные оболочки или (возможно, более вероятно), время от времени замечавших сбой explorer.exe.

...