Как избежать исключения настройки Window.TaskbarItemInfo в редких ситуациях

В ходе тестирования моего приложения в среде 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.

0 ответов

Другие вопросы по тегам