我正在尝试从自己的共享合同中激活我的应用程序(请 - 从评论的角度来看,不要评论是否可以这样做...应用程序激活是通过一个按钮完成的分享合同用户界面,除非用户主动,否则不会发生。我在这里询问技术问题,而不是用户体验方面的问题 - 谢谢!)
我设置它的方式是这样的:
this.m_shareOperation.ReportStarted();
// ....
this.m_shareOperation.ReportCompleted();
await Launcher.LaunchUriAsync(new Uri("se-myapp:///something"));
一切似乎都运行正常 - 激活事件/覆盖触发,应用程序实际激活并显示,但随后,在我的OnActivated代码完成后,出现以下错误:
The operation cannot be completed because the window is being closed. (Exception from HRESULT: 0x802A0201)
我可以做些什么来完成这项工作?有什么想法吗?
出现此问题的callstack就是这个(没有用户代码,不会被UnhandledException事件处理)...
mscorlib.dll!System.Threading.Tasks.AwaitTaskContinuation.ThrowAsyncIfNecessary.AnonymousMethod__1(object s)+ 0x33 bytes mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(对象状态)+ 0x3e字节 mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state,bool preserveSyncCtx)+ 0xa7 bytes mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state,bool preserveSyncCtx)+ 0x16 bytes mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()+ 0x60 bytes mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()+ 0x149 bytes mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()+ 0x5 bytes [原生于管理过渡]
答案 0 :(得分:2)
解决方案相当简单,如果有些老派(尽管WinRT完全支持)......
第0步:定义您要在应用中使用的命名事件:
public static EventWaitHandle GetActivationEvent()
{
EventWaitHandle sync = new EventWaitHandle(false, EventResetMode.ManualReset, Constants.ActivationEventName);
return sync;
}
步骤1:在OnActivate()覆盖中,获取该事件并进行设置:
using (var sync = Utils.GetActivationEvent())
{
sync.Set();
}
步骤2:从共享目标中,按以下方式激活自己:
using (EventWaitHandle sync = Utils.GetActivationEvent())
{
await Launcher.LaunchUriAsync(new Uri(String.Format("my-protocol:///?id={0}&operation={1}", id, op)));
await Task.Run(() => sync.WaitOne(5000));
this.m_shareOperation.ReportCompleted();
}
就是这样。这将确保Windows不会混淆和抱怨应用程序关闭和打开同时。
答案 1 :(得分:0)
你不能。
不幸的是,你正在尝试混合那些并非混合的东西。如果您为应用程序创建自定义协议激活,则调用包含该协议的uri将启动您的应用程序。共享魅力只会激活具有共享目标合同的应用程序。没有例外。
以下是有关协议激活的更多信息。您可能会发现它很有用:http://blog.jerrynixon.com/2012/10/walkthrough-using-windows-8-custom.html