2010-11-20 4 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» в « C: \ Users \ ptom \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Wis ". Я попытался связать файлы с этим ярлыком, созданным при установке, и связать файлы с setup.exe. Когда я нажимаю на файл, приложение запускается, но указывает, что AppDomain.CurrentDomain.SetupInformation.ActivationArguments - null. (По «указывает» я имею в виду, что текстовое поле заполняется текстом, из которого я тестирую, чтобы определить, является ли оно нулевым). Если я запустил приложение из отладки или просто запустил его из стартового меню, он сделает то, что я ожидаю, следуя пути кода, который указывает, что ActivationArguments не является нулевым, но его значение ActivationData (строка []) имеет длину 0.

Вот код из 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"; 
       } 
      } 


     } 
    } 
} 

Благодаря

ответ

3

Прежде всего, вы должны добавить файл доц для ClickOnce опубликовать (выберите Проект-> свойства-> Publish-Options-> File Associations)
Затем добавьте ссылку на "System.Deployment"
Тогда вы могли бы извлечь путь в App.cs таким образом, в зависимости от типа запуска (ClickOnce или 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

Я вставил в ваш код; у вас был объект ApplicationDeployment; Сначала я это вырезал, и это сработало. Мне пришлось добавить ссылку на System.Deployment, чтобы использовать этот первый тест. –

3

вы проверили Environment.GetCommandLineArgs()? Это показывает аргументы, с которых было запущено ваше приложение.

Если ваше приложение связано с файлом, оно должно содержать имя файла как один из аргументов.

+0

Я прочитал в паре мест, что простые решения, такие как, которые не работают, но теперь я просто попытался это и он работает. Поэтому я не знаю, что с этим делать. Я связал ярлык click-once в моем .../windows/Start Menu/Programs/Pwis-папке с расширением и, конечно же, второй аргумент, когда я нажимаю на папку с указанным расширением, является файлом. Так что это проще, чем ответ the_smallest, но не уверен, что этот другой ответ охватывает больше сценариев? –