2010-11-20 4 views
4

Mon application est seulement pour moi et ses collègues, donc je ne se soucient pas si c'est Cliquez-Une ou copier-la-exe. Je veux être capable de cliquer sur un fichier avec une extension donnée dans Windows Explorer et lancer mon programme et ouvrir ce fichier. Je ne peux pas l'obtenir pour capturer le nom du fichier.WPF; cliquez une fois; Double clic sur le fichier à lancer VS 2008

solution ostensible:

http://blogs.msdn.com/b/avip/archive/2008/10/27/wpf-supporting-command-line-arguments-and-file-extensions.aspx

Le code que je suis en train est ci-dessous et à ce stade tout ce que je suis en train de faire est de mettre le nom du fichier cliqué dans une zone de texte. Je soupçonne que mon ignorance pertinente est sur la façon de référencer l'application click-once de Windows Explorer. Quand je construis je me retrouve avec un fichier appelé setup.exe, un fichier appelé Wis.application, et quand je clique sur « setup » pour l'installer, je me retrouve avec un raccourci de type « référence d'application Cliquez-fois » dans " C: \ Utilisateurs \ ptom \ AppData \ Roaming \ Microsoft \ Windows \ Menu Démarrer \ Programmes \ Wis ". J'ai essayé d'associer des fichiers avec ce raccourci créé par install, et en associant des fichiers avec setup.exe. Lorsque je clique sur le fichier, l'application se lance, mais indique que AppDomain.CurrentDomain.SetupInformation.ActivationArguments est nulle. (Par "indique" je veux dire la boîte de texte est rempli avec le texte d'où je vérifie pour voir si c'est nul). Si je lance l'application de débogage, ou tout simplement en exécutant dans le menu de démarrage, il fait ce que je pense, en suivant le chemin de code qui indique que ActivationArguments n'est pas nul, mais que son ActivationData (string []) est de longueur 0.

Voici le code de App.xaml.cs

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data; 
using System.Linq; 
using System.Windows; 

namespace Wis 
{ 
    /// <summary> 
    /// Interaction logic for App.xaml 
    /// </summary> 
    public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 

      // Check if this was launched by double-clicking a doc. If so, use that as the 

      // startup file name. 
      if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments == null) 
      { 
       this.Properties["DoubleClickedFileToLoad"] = "There were no activation arguments AGAIN"; 
      } 
      else 
      { 
       if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null 
            && AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Length > 0) 
       { 
        this.Properties["DoubleClickedFileToLoad"] = 
        AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0]; 
       } 
       else 
       { 
        this.Properties["DoubleClickedFileToLoad"] = "Type in a file name"; 
       } 
      } 


     } 
    } 
} 

Merci

Répondre

3

Tout d'abord, vous devez ajouter le fichier assoc pour ClickOnce-publier (Sélectionnez Projet-> Propriétés-> Publier-Options-> Associations de fichiers)
ajouter ensuite référence à "System.Deployment"
Ensuite, vous pouvez extraire chemin App.cs de telle manière, selon le type de démarrage (ClickOnce ou local)

protected override void OnStartup(System.Windows.StartupEventArgs e) 
    { 
     var path = GetPath (e); 
    }   

    private static string GetPath(StartupEventArgs e) 
    { 
     if (!ApplicationDeployment.IsNetworkDeployed) 
      return e.Args.Length != 0 ? e.Args[0] : null; 
     if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments == null) 
      return null; 
     var args = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData; 
     return args == null || args.Length == 0 ? null : new Uri(args[0]).LocalPath; 
    } 
+0

J'ai collé dans votre code; vous aviez un objet nommé ApplicationDeployment; Je l'ai coupé au début et ça a marché. J'ai dû ajouter une référence à System.Deployment pour utiliser ce premier test. –

3

Avez-vous vérifié Environment.GetCommandLineArgs()? Affiche les arguments avec lesquels votre application a été démarrée.

Si votre application est associée à un fichier, il doit contenir le nom de fichier comme l'un des arguments.

+0

J'avais lu dans quelques endroits que des solutions simples, comme qui ne fonctionnent pas, mais maintenant, je viens d'essayer et ça marche. Donc je ne sais pas quoi en faire. J'associé le clic-raccourci une fois dans mon .../Windows/Menu Démarrer/dossier Programmes/LABS avec une extension et bien sûr, le 2ème argument lorsque je clique sur un dossier avec Teh extension donnée est le fichier. Donc, c'est un moyen plus simple que la réponse de the_smallest, pas sûr si cette autre réponse couvre plus de scénarios? –

Questions connexes