2010-11-20 3 views
4

私のアプリケーションは私と同僚のためのものなので、Click-Onceかcopy-the-exeかどうかは気にしません。 Windowsエクスプローラで特定の拡張子を持つファイルをクリックしてプログラムを起動してそのファイルを開くことができるようにしたい。私はファイル名を取得することができません。WPF;一度クリックします。起動するファイルをダブルクリックします。 VS 2008

表向きのソリューション:

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

私がしようとしているコードは以下であり、この時点で私がやろうとしているすべてのテキストボックスにクリックしたファイルの名前を入れています。私は、私の関連する無知は、Windowsエクスプローラからクリックワンアプリケーションを参照する方法に関するものだと思う。私がビルドすると、setup.exeという名前のファイル、つまりWis.applicationというファイルが作成されます。インストールするために「setup」をクリックすると、「Click-Once application reference」というタイプのショートカットが作成されます。 C:\ Users \ ptom \ AppData \ Roaming \ Microsoft \ Windows \スタートメニュー\プログラム\ Wis "を選択します。私は、インストールによって作成されたそのショートカットとファイルを関連づけ、ファイルをsetup.exeに関連付けることを試みました。ファイルをクリックすると、アプリケーションが起動しますが、 AppDomain.CurrentDomain.SetupInformation.ActivationArgumentsがnullであることが示されます。 ( "によって"私はそれがnullであるかどうかをテストする場所からのテキストでテキストボックスがいっぱいになることを意味します)。私は、デバッグから、または単に起動メニューから実行することで、アプリケーションを実行する場合は、ActivationArgumentsがnullではないことを示すコードパスに従うが、そのActivationData(文字列[])が長さここで

0は

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


     } 
    } 
} 

おかげ

答えて

3

ClickOnceのは、公開用のファイルの連想を追加する必要がまず第一に(プロジェクト - を選択>プロパティ - >公開 - [オプション] - > [ファイルの関連付け)
次に「System.Deployment
への参照を追加し、あなたは可能性があり私はそのような単純なソリューションが動作しないというカップルの場所で読んでいたが、今、私はちょうどそれを試してみました

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

あなたのコードに貼り付けました。 ApplicationDeploymentという名前のオブジェクトがあります。私は最初にそれをカットし、それは働いた。最初のテストを使用するために、System.Deploymentへの参照を追加する必要がありました。 –

3

あなたがEnvironment.GetCommandLineArgs()を確認しましapp.xaml.csからのコードですか? これは、アプリケーションが開始された引数を示しています。

アプリケーションがファイルに関連付けられている場合は、そのファイル名を引数の1つとして含める必要があります。

+0

(ClickOnceのまたはローカル)のスタートアップの種類に応じて、このようにしてApp.csでパスを抽出し、それは動作します。だから私はそれをどうしたらいいのか分からない。私は.../windows/Start Menu/Programs/Pwisフォルダ内の一度だけショートカットを拡張子で関連付けましたが、十分な大きさで、指定された拡張子を持つフォルダをクリックすると2番目の引数がファイルです。それはthe_smallestの答えよりも簡単な方法ですが、他の答えがより多くのシナリオをカバーしているかどうかは分かりません。 –