1

独自の共有契約からアプリをアクティブ化しようとしています (認証の観点からこれを行ってもよいかどうかについてコメントしないでください... アプリのアクティブ化は、共有契約 UI のボタンを介して行われますここで質問しているのは技術的な問題であり、ユーザー エクスペリエンスの側面についてではありません - ありがとうございます!!)

私が設定した方法は次のとおりです。

this.m_shareOperation.ReportStarted();

// ....

this.m_shareOperation.ReportCompleted();

await Launcher.LaunchUriAsync(new Uri("se-myapp:///something"));

すべてが正常に動作しているようです - Activation イベント/オーバーライドが発生し、アプリが実際にアクティブ化されて表示されますが、OnActivated コードが完了すると、次のエラーが表示されます。

The operation cannot be completed because the window is being closed. (Exception from HRESULT: 0x802A0201)

これを機能させるにはどうすればよいですか?何か案が?

これが表示されるコールスタックは次のとおりです (ユーザー コードはなく、UnhandledException イベントによって処理されません)...

mscorlib.dll!System.Threading.Tasks.AwaitTaskContinuation.ThrowAsyncIfNecessary.AnonymousMethod__1(オブジェクト) + 0x33 バイト mscorlib.dll!System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(オブジェクトの状態) + 0x3e バイトRunInternal(System.Threading.ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクト状態、bool preserveSyncCtx) + 0xa7 バイト mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext、System.Threading.ContextCallback コールバック、オブジェクトの状態、bool preserveSyncCtx) + 0x16 バイト mscorlib.dll!System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() + 0x60 バイト mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch() + 0x149 バイト mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() + 0x5 バイト [Managed Transition にネイティブ]

4

2 に答える 2

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 が混乱したり、アプリを閉じたり開いたりすることについて泣き言を言うことがなくなります。

于 2013-02-25T19:59:56.137 に答える
0

できません。

残念ながら、混ぜてはいけないものを混ぜようとしています。アプリのカスタム プロトコル アクティベーションを作成する場合、プロトコルを含む URI を呼び出すと、アプリが起動します。シェアチャームは、シェア対象契約のあるアプリのみ起動します。例外なく。

プロトコルのアクティベーションについてもう少し詳しく説明します。役に立つかもしれません: http://blog.jerrynixon.com/2012/10/walkthrough-using-windows-8-custom.html

于 2013-02-18T19:32:16.600 に答える