2016-04-08 14 views
3

Uygulamam, uygulama çalışırken ve kullanıcı içeriği paylaşmak istediğinde, paylaşılan ve paylaşılan sorunlar için bir hedef uygulama. Çalışan uygulamadan bir çerçeve kullanamıyorum, çünkü "marshalling thread" istisnası alıyorum.Windows 10'da hedef Evrensel Uygulamalar Template10 yaklaşımı

uygulama farklı bir iş parçacığı için sıraya konan bir arabirimi çağırdı. \ R \ n \ r \ nFailed benziyor App.xaml.cs görsel uygulamanın kök

Benim OnStartAsync yöntem başlatmak için bu.

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; 
    } 
} 

ben uygulama zaten çalışıyorsa hangi durumda yani ShareTargetActivatedEventArgs için başka koşul nasıl işleneceğini emin değilim. Bir similar question on Stackoverlow buldum, ancak Template10 kütüphanesini kullanmıyor. Template10 kütüphanesi kullanılarak bu senaryo nasıl ele alınır.

cevap

0

Eğer UWP paylaşım hedefini kullandığınızda ve mevcut uygulama (aslında askıya ve devam ediliyor oldu - bu olay ilk tetiklenir) 'çalışan' olduğu, yeni ApplicationView oluşturuluyor. Bu harika bir şey, ancak doğru bir şekilde ele alınmalıdır - yeni dağıtıcı ile yeni bir pencere alırsınız ve bir öncekinden bir şey çalıştırmaya çalışırsanız 'yanlış iplik' istisnası alırsınız (özellikle INotifyPropertyChanged için dikkat edin). Uygulamanız şu anda en az iki iş parçacığı kullanıyor ve çok iş parçacıklı uygulamasının tüm sonuçlarını alıyorsunuz.

En iyisi, istediğiniz yeni pencereyi yeni sayfa, çerçeve veya başka bir yere yerleştirmenizdir. Her şey tasarımınıza bağlı. Ancak, bir şey çalıştırmak veya uygulamasını çalıştıran 'u değiştirmek istiyorsanız, kendi Dispatcher'u kullanmanız gerekecektir. Örneğin bir tane görüşlerini listeleme ve alarak bunu elde edebilirsiniz:

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

Ayrıca değişkende orijinal pencerenin dağıtıcısı hatırlamak ve ardından paylaşımı sonra kullanabilirsiniz. Kodunuz async ise, paylaşım hedef bölümünden ayrılmadan önce dikkatlice bakıp bitmiş olduğundan emin olmanız gerekir.

Ayrıca, orijinal pencerenizi görüntülemek için ApplicationViewSwitcher'u da kullanabileceğinizi unutmayın (ancak bu, kodun paylaşımın farklı iş parçacıklarında çalıştırıldığını değiştirmez).

Çoklu görünüm programlama hakkında daha fazla bilgiye ihtiyacınız varsa, at MSDN bir göz atın.

+0

Cevabınız için teşekkürler. Şimdi 'Window' current.Content 'ayarlamak için '' '' blok '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ı kullanıyorum. Bunu yapmanın doğru yolu mu? –

+0

@VivekMaskara Kod çalışıyor mu? İlk 'if (shareArgs.PreviousExecutionState! = ApplicationExecutionState.Running)' 'ile ilgili emin değilim - uygulamanın nasıl daha önce askıya alındığını/sonlandırılacağını bilmediğinden emin değilim. Uygulamanızın birden çok görünümünü olup olmadığını kontrol edebilir ve ardından uygun işlemleri gerçekleştirebilirsiniz. Kodunuz dağıtıcı üzerinde çalışıyorsa - Neyi başarmak istediğinizi anlayabildiğimden emin değilim - ancak görebildiğim kadarıyla yeni bir pencere (yeni uygulama görünümü) içeriğini önceki dağıtıcı üzerinden ayarlamaya çalışıyorsunuzdur. Yapmak istediğin şey bu. – Romasz

+0

@VivekMaskara Yeni uygulama görünümünde, 'Window.Current' ifadesinin yeni pencereye değil, eski pencereye işaret ettiğini unutmayın. – Romasz

İlgili konular