2014-01-15 2 views
5

Ich arbeite an dieser Windows Store App, ich will, dass es Open With unterstützt, wenn der Endbenutzer eine Datei mit dieser App öffnen möchte, fügte ich hinzu unterstütztes Format auf den Abschnitt Deklarationen in der App-Manifest-Datei wie dieses Bild zeigt:So überschreiben OnFileActivated Ereignis in App.cs, um OpenWith richtig zu machen

enter image description here

Und ich overrode die OnFileActivated Ereignis in der Datei App.xaml.cs wie folgt:

protected override void OnFileActivated(FileActivatedEventArgs args) 
     { 
      if (args.Files.Count > 1) 
      { 
       MessageDialog messageDialog1 = new MessageDialog("DirectTouchPlayer can't open many files, the first file will be opened."); 
       messageDialog1.ShowAsync(); 
      } 
      OpenedMediaFile = (StorageFile)args.Files.First(); 
      MessageDialog messageDialog2 = new MessageDialog(OpenedMediaFile.Path + " " + " : Opened !"); 
      messageDialog2.ShowAsync(); 
     } 

diese Ereignis scheint nicht zu schießen, wenn ich Führen Sie OpenWith auf eine .MP4-Datei, die Anwendung lunches aber kann den Begrüßungsbildschirm nicht beenden, ich habe versucht, das Ereignis wie dieses debuggen thread erklärt, aber der Debugger stoppt nicht an jedem Haltepunkt in der OnFileActivated-Methode markiert, schätze ich Ihre Hilfe.

Update 1: Wenn Openwith auf eine Datei, und danach kann die App nicht ganz Splash Screen, ich habe jetzt dieses Meldungsfeld Fehler

enter image description here

Update 2 :

ich änderte meine OnFileActivated Event-Handler so sein:

protected override async void OnFileActivated(FileActivatedEventArgs args) 
     { 
      var loadMediaFileTask = new Task<IStorageItem>(() => 
                  { 
                   return args.Files.First(); 
                  }); 
      OpenedFile = await loadMediaFileTask; 
     } 

wo OpenedFile ein:

public static IStorageItem OpenedFile { get; set; } 

Dass ich als Parameter durch die Navigation im OnLaunched Ereignisse passieren:

if (rootFrame.Content == null) 
      { 
       // When the navigation stack isn't restored navigate to the first page, 
       // configuring the new page by passing required information as a navigation 
       // parameter 
       rootFrame.Navigate(typeof(PlayerPageView), OpenedFile); 
      } 

Und PlayerPageView ist die Seite, die das Video in einem Media verbrauchen

All dieses Update funktioniert auch nicht, ich verstehe nicht, was ich tun sollte, würde ich mich freuen, wenn Sie Dinge zu mir klären.

+0

Es scheint mir, als würde eine Ausnahme in der App geworfen werden. Überprüfen Sie die Ereignisanzeige, um festzustellen, ob Ereignisse vor dem Ereignis ausgelöst wurden. Wenn es nur Ladezeit ist, kann es sein, dass Sie die Datei (falls es möglicherweise groß ist) in einem Hintergrundthread laden müssen, bis sie fertig ist. Mach alles, was du kannst, um deine UI schnell hochzuladen, und zeige dann einen Ladebildschirm an, bis er fertig ist. (Auch große Auswahl an Musik;) –

+0

@NateDiamond Ich schätze deine Hilfe, ich habe meinen Code aktualisiert und so meine Frage, und das funktioniert nicht, bitte überprüfen Sie mein Update – AymenDaoudi

Antwort

6

OnLaunched wird wahrscheinlich nicht aufgerufen, da dies die Methode ist, die aufgerufen wird, wenn die App normal vom Benutzer geöffnet wird. Sie müssen die gleiche Logik, die Sie wahrscheinlich innerhalb von OnLaunched innerhalb der OnFileActivated-Methode haben.

Die Probe, die sie bieten hat diese Notiz über OnLaunched:

/// <summary> 
/// Invoked when the application is launched normally by the end user. Other entry points 
/// will be used when the application is launched to open a specific file, to display 
/// search results, and so forth. 
/// </summary> 
/// <param name="args">Details about the launch request and process.</param> 

Hier ist die sample version that Microsoft provides in their Windows 8.1 App Sample for Launching by Association:

/// <summary> 
// Handle file activations. 
/// </summary> 
protected override async void OnFileActivated(FileActivatedEventArgs args) 
{ 
    Frame rootFrame = Window.Current.Content as Frame; 
    // Do not repeat app initialization when the Window already has content, 
    // just ensure that the window is active 
    if (rootFrame == null) 
    { 
     // Create a Frame to act as the navigation context and navigate to the first page 
     rootFrame = new Frame(); 
     // Associate the frame with a SuspensionManager key 
     SuspensionManager.RegisterFrame(rootFrame, "AppFrame"); 
     if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) 
     { 
      // Restore the saved session state only when appropriate 
      try 
      { 
       await SuspensionManager.RestoreAsync(); 
      } 
      catch (SuspensionManagerException) 
      { 
       //Something went wrong restoring state. 
       //Assume there is no state and continue 
      } 
     } 

     // Place the frame in the current Window 
     Window.Current.Content = rootFrame; 
    } 

    if (rootFrame.Content == null) 
    { 
     if (!rootFrame.Navigate(typeof(MainPage))) 
     { 
      throw new Exception("Failed to create initial page"); 
     } 
    } 

    var p = rootFrame.Content as MainPage; 
    p.FileEvent = args; 
    p.ProtocolEvent = null; 
    p.NavigateToFilePage(); 

    // Ensure the current window is active 
    Window.Current.Activate(); 
} 

Ich schlage vor, diese so weit wie möglich zu emulieren.

Eine andere Sache zu beachten ist, dass ich nicht vorschlagen, Popup MessageDialogs in der Activated Veranstaltung überhaupt. Speichern Sie das für die Seite, auf der Sie ankommen (sogar ein ExtendedSplash Bildschirm), wenn Sie sicher sind, dass der UI-Thread frei ist.

Hoffe, dass dies hilft und glücklich Codierung!

+0

Thx @Nate Diamond, die funktioniert, kann ich nur hinzufügen dass, um die MainPage übergebene Informationen, die in OnLoaded-Ereignis durchgeführt werden sollte, Thx wieder, dass wirklich geholfen hat – AymenDaoudi

Verwandte Themen