Приложение UWP падает, когда Clipboard.GetContent () вызывается изнутри OnNavigatedTo () - PullRequest
0 голосов
/ 01 ноября 2019

В приложении UWP, когда я пытаюсь извлечь содержимое буфера обмена из метода OnNavigatedTo, приложение вылетает. Может ли кто-нибудь помочь с этим, пожалуйста?

Редактировать: Кажется, что сбой только при запуске, нажав на него из меню «Пуск» или запустив его с помощью другого приложения. Но при запуске Visual Studio все работает отлично!

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Нет проблем, если вы используете Clipboard в OnNavigatedTo или даже раньше (как в конструкторе страниц), но вы должны вызвать Clipboard API из потока пользовательского интерфейса. Это означает, что будет работать следующее:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    var content = Clipboard.GetContent();
}

Но произойдет сбой следующего:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    base.OnNavigatedTo(e);
    await Task.Run(() => { Clipboard.GetContent(); });
}

Пожалуйста, убедитесь, что ваш код действительно обращается к Clipboard из потока пользовательского интерфейса, и он долженработать должным образом. Чтобы перейти к потоку пользовательского интерфейса, вы можете использовать Dispatcher (см., Например, этот вопрос SO )

0 голосов
/ 15 ноября 2019

Отладка в Visual Studio отличается от меню «Пуск», вы можете попробовать событие «Возобновление и приостановка» при запуске приложения в vs, это событие не будет запускаться нормально.

Кроме того, в этом документе о буфере обмена упоминается, что вам необходимо использовать буфер обмена после того, как CoreWindow активен. Когда событие OnNavigatedTo запущено, CoreWindow еще не готово. Вы можете попробовать следующий код, и событие Activated будет срабатывать много раз, в него можно добавить некоторые суждения.

public MainPage()
{
    this.InitializeComponent();
    CoreWindow window = CoreWindow.GetForCurrentThread();
    window.Activated += Window_Activated; 

}

private async void Window_Activated(CoreWindow sender, WindowActivatedEventArgs args)
{
    var dataPackageView = Clipboard.GetContent();
    var text = await dataPackageView.GetTextAsync();
}
...