2016-04-08 12 views
3

私のアプリは共有の対象アプリで、アプリが実行されているときにコンテンツを共有したいときに問題に直面しています。実行中のアプリケーションからフレームを使用することはできません。なぜなら、「マーシャリングスレッド」例外が発生するからです。Windows 10でユニバーサルアプリケーションTemplate10のアプローチを共有する

アプリケーションは、異なるスレッドに対してマーシャリングされたインターフェイスと呼ばれます。\ r \ nを\ rを\ nFailedががどのように見えるApp.xaml.csで視覚的アプリケーションのルート

マイOnStartAsync方法を初期化しますこの。

public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args) 
{ 
    switch (DetermineStartCause(args)) 
    { 
     // other cases 
     case AdditionalKinds.Other: 
      if (args is ShareTargetActivatedEventArgs) 
      { 
       var shareArgs = args as ShareTargetActivatedEventArgs; 

       if (shareArgs.PreviousExecutionState != ApplicationExecutionState.Running) 
       { 
        Uri webUrl = await shareArgs.ShareOperation.Data.GetWebLinkAsync(); 
        Debug.WriteLine(webUrl.AbsoluteUri); 

        //shareArgs.ShareOperation.ReportStarted(); 
        NavigationService.Navigate(typeof(Views.MainPage), webUrl.AbsoluteUri); 
       } 
       else 
       { 
         await CoreApplication.Views.First().Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async() => 
         { 
          Uri webUrl = await shareArgs.ShareOperation.Data.GetWebLinkAsync(); 
          var nav = NavigationServiceFactory(BackButton.Attach, ExistingContent.Exclude); 
          Window.Current.Content = new Views.ShareLaunch(); 
          Window.Current.Activate(); 
         }); 
       } 
      } 
      break; 
    } 
} 

私は、アプリケーションがすでに実行されている場合、すなわち、ShareTargetActivatedEventArgsのための他の条件をどのように処理するかを確認していません。 similar question on Stackoverlowが見つかりましたが、Template10ライブラリは使用していません。 Template10ライブラリを使用してこのシナリオを処理する方法。

答えて

0

あなたがUWP、あなたの現在のアプリに共有ターゲットを使用します(実際にはに懸濁しているとを再開している - このイベントは、最初に起動されます)「を実行」され、新しいApplicationViewが作成されています。これはクールなことですが、正しく処理する必要があります。新しいディスパッチャーで新しいウィンドウを取得し、前のものから何かを実行しようとすると、間違ったスレッド例外が発生します(特にを参照してください。INotifyPropertyChanged)。あなたのアプリは少なくとも2つのスレッドを実行しており、マルチスレッドアプリケーションのすべての結果が得られます。

新しいページやフレームなど、新しいウィンドウを自由に入れることができます。すべてがあなたのデザインに依存します。しかし、を実行してアプリを実行する場合は、ディスパッチャーを使用する必要があります。あなたは、たとえばビューをリストアップし、1を取ることによって、それを得ることができます。

await CoreApplication.Views.First().Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => { /*do some code*/ }); 

ます。また、変数にあなたの元のウィンドウのディスパッチャを覚えて、その後、共有した後、それを使用することができます。あなたのコードがasyncの場合は、共有ターゲットセクションを離れる前に、それを見て終了していることを確認する必要があります。

ApplicationViewSwitcherを使用して元のウィンドウを表示することもできます(しかし、共有からのコードが別のスレッドで実行されていることは変わりません)。

複数のビュープログラミングに関する詳細が必要な場合は、at MSDNをご覧ください。

+0

お返事ありがとうございます。今、 'else'ブロックで' Dispatcher'を使って 'Window.Current.Content'をいくつかのビューに設定しています。それは正しい方法ですか? –

+0

@VivekMaskaraコードは機能していますか?あなたの最初の 'if(shareArgs.PreviousExecutionState!= ApplicationExecutionState.Running) 'についてはわかりません - これがどのように振る舞うかは分かりませんが、以前は中断/終了していました。また、アプリの複数のビューがあるかどうかを確認してから、適切な操作を実行することもできます。あなたのコードはディスパッチャで実行されますが、達成したいことがわかっているかどうかはわかりませんが、以前のディスパッチャから新しいウィンドウの内容(新しいアプリケーションビュー)を設定しようとしていることがわかりますそれはあなたがしたいことです。 – Romasz

+0

@VivekMaskara新しいアプリケーションビューでは、 'Window.Current'は新しいウィンドウを参照し、古いウィンドウは参照しません。 – Romasz

関連する問題