2014-01-15 54 views
0

我嘗試LaunchUriAsync當我的應用程序使用此代碼開始:LaunchUriAsync定製方案時,Windows 8的Metro應用開始

/// <summary> 
/// Navigate to the given URI in a web browser task if the uri is valid 
/// We can use all scheme provide by windows excepted file:/// 
/// </summary> 
/// <param name="uri">Uri of the page</param> 
public async void TryNavigateToBrowser(string uri) 
{ 
    if (uri != null && uri != "") 
    { 
    try 
    { 
     /* Firstly we try to made a launch async for custom URI scheme */ 
     var success = await Windows.System.Launcher.LaunchUriAsync(new Uri(uri)); 

     /* Secondly if it doesn't works we try the same but in UI thread 
     * If a custom scheme is tried to be displayed in UI thread UI should crash */ 
     if (!success) 
     { 
     CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, 
     () => 
     { 
      /* we made a synchronous call to LaunchUriAsync in UI thread */ 
      var successUI = Windows.System.Launcher.LaunchUriAsync(new Uri(uri)).AsTask().Result; 

      if (!successUI) 
      { 
      TryNavigateToBrowser(uri); 
      } 
     }); 
     } 
    } 
    catch (Exception) 
    { 
     /* If URI isn't well formated we try to found a file to launch it */ 
     NavigateToLocalUri(uri); 
    } 
    } 
} 

/// <summary> 
/// Use to provide customer sended URI for opening file in app storage 
/// </summary> 
/// <param name="uri"></param> 
internal static async void NavigateToLocalUri(string uri) 
{ 
    try 
    { 
    StorageFile storageFile = await ApplicationData.Current.LocalFolder.GetFileAsync(uri); 
    if (storageFile != null) 
    { 
     var success = Windows.System.Launcher.LaunchFileAsync(storageFile); 
    } 
    } 
    catch (Exception) 
    { 
    /* If no file can be displayed we send a capptain error */ 
    throw new CapptainException("URI cannot be opened "); 
    } 
} 

我嘗試在App.xaml.cs使用這個「OnLaunched」的方法。

這適用於很多URI,但通過附加到http://tozon.info/blog/post/2011/10/06/Windows-8-Metro-declarations-Protocol.aspx我不能在應用程序啓動時將其用於具有自定義方案的URI。這會凍結UI。但是,當應用程序已經啓動,我把這個功能設置爲一個按鈕,這爲自定義方案工作。 我不知道爲什麼這不起作用的應用程序啓動

回答

0

我知道這是一個較舊的帖子,你可能已經想通了,但我想我有一個答案。我以前遇到過這樣的事情。

如果您的OnActivate和OnProtocolActivate方法與該帖子中的內容完全相同,那麼如果該應用程序尚未運行,則該方法將不起作用。這是因爲你的應用程序沒有可用的框架。如果沒有框架,那麼沒有任何可編程工作來設置要加載的視圖。如果應用程序已經運行,那麼已經有一個框架可以爲你工作,這就是爲什麼它已經開始工作。

看看新項目附帶的OnLaunched代碼。如果它不存在,它們會創建一個新框架。我相信,如果您只是在OnProtocolActivated方法的開始處添加以下代碼,則應該在應用程序尚未啓動時運行。

private void OnProtocolActivated(ProtocolActivatedEventArgs args) 
{ 
    Frame rootFrame = Window.Current.Content as Frame; 

    if (rootFrame == null) 
    {     
     rootFrame = new Frame(); 
     Window.Current.Content = rootFrame; 
    } 
/// Your code goes after 

希望有幫助。

相關問題