从 OnNavigatedTo() 内部调用 Clipboard.GetContent() 时 UWP 应用程序崩溃
UWP App crashes when Clipboard.GetContent() is called from inside OnNavigatedTo()
在 UWP 应用程序中,当我尝试从 OnNavigatedTo
方法中检索剪贴板的内容时,应用程序崩溃了。有人可以帮忙吗?
编辑:它似乎只有在通过从开始菜单中单击它或通过另一个应用程序启动它时才会崩溃。但是当 Visual Studio 启动时,它工作正常!
如果你在 OnNavigatedTo
或更早的时候使用 Clipboard
没有问题(比如在页面构造函数中),但是你 必须 调用 Clipboard
来自 UI 线程的 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(); });
}
请确保您的代码确实从 UI 线程访问了 Clipboard
,并且它应该可以正常工作。要移动到 UI 线程,您可以使用 Dispatcher
(参见示例 )
visual studio中的调试与开始菜单不同,您可以在运行vs中的app中尝试Resuming和Suspending事件,这些事件不会正常触发。
另外,关于剪贴板,这个document提到你需要在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();
}
在 UWP 应用程序中,当我尝试从 OnNavigatedTo
方法中检索剪贴板的内容时,应用程序崩溃了。有人可以帮忙吗?
编辑:它似乎只有在通过从开始菜单中单击它或通过另一个应用程序启动它时才会崩溃。但是当 Visual Studio 启动时,它工作正常!
如果你在 OnNavigatedTo
或更早的时候使用 Clipboard
没有问题(比如在页面构造函数中),但是你 必须 调用 Clipboard
来自 UI 线程的 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(); });
}
请确保您的代码确实从 UI 线程访问了 Clipboard
,并且它应该可以正常工作。要移动到 UI 线程,您可以使用 Dispatcher
(参见示例
visual studio中的调试与开始菜单不同,您可以在运行vs中的app中尝试Resuming和Suspending事件,这些事件不会正常触发。
另外,关于剪贴板,这个document提到你需要在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();
}