WPF; нажмите один раз; Двойной щелчок по файлу для запуска; VS 2008 - PullRequest
4 голосов
/ 20 ноября 2010

Мое приложение предназначено только для меня и его коллег, поэтому мне все равно, будет ли это Click-Once или copy-the-exe.Я хочу иметь возможность щелкнуть файл с заданным расширением в проводнике Windows, чтобы моя программа запустилась и открыла этот файл.Я не могу получить его, чтобы захватить имя файла.

Возможное решение:

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


        }
    }
}

Спасибо

Ответы [ 2 ]

3 голосов
/ 20 ноября 2010

Прежде всего, вы должны добавить привязку файла для ClickOnce-publish (Выберите Project-> Properties-> Publish-Options-> Ассоциации файлов)Затем добавьте ссылку на " 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;
    }
3 голосов
/ 20 ноября 2010

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

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

...