Обработка аргументов командной строки в одном приложении

У меня есть сложный вопрос относительно класса SingleInstance на CodeProject.

Я хочу иметь возможность обрабатывать аргументы командной строки после загрузки моего окна и до того, как я начал использовать SingleInstance, я обработал все это в событии Loaded моего MainWindow. Теперь я думаю, что вынужден поместить все это в мой класс App, но я не знаю, как получить доступ к каким-либо свойствам или методам из моей ViewModel.

Код для приложения:

public partial class App : System.Windows.Application, ISingleInstanceApp
{
    public static new App Current
    {
        get {
            return System.Windows.Application.Current as App;
        }
    }
    internal ApplicationInitializeDelegate ApplicationInitialize;
    internal delegate void ApplicationInitializeDelegate(SplashScreen splashWindow);

    private const string Unique = "Unique App Id";

    public bool SignalExternalCommandLineArgs(IList<string> args)
    {
        //This executes for each instance after the first. 
        //We can activate the window and access properties/methods of type Window, 
        //but not of type MainWindow, and, therefore, have no 
        //access to ViewModel.
        this.MainWindow.Activate();
        return true;
    }

    [STAThread]
    public static void Main(params string[] Arguments)
    {
        //Stops new windows from being created.
        if (SingleInstance<App>.InitializeAsFirstInstance(Unique))
        {
            App app = new App();

            app.InitializeComponent();
            app.Run();

            SingleInstance<App>.Cleanup();
        } else {
            //Runs each time after first instance.
        }
    }

    public App()
    {
        ApplicationInitialize = _applicationInitialize;
    }


    //I added this here while experimenting, though, obviously it doesn't do anything yet. Can we do something here, possibly?
    protected override void OnStartup(StartupEventArgs e)
    {
        if (e.Args.Length > 0)
        {
        }
    }

    private void _applicationInitialize(SplashScreen splashWindow)
    {
        //Do work and update splashWindow

        //Create the main window on the UI thread.
        Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(delegate ()
        {
            MainWindow = new MainWindow();
            MainWindow.Show();
        }));
    }
}

Редактировать 1

Я придумал очень грязный (и не такой идеальный) взлом, который дает мне именно то, что я хочу, но не так, как я думаю, что я должен это делать.

public bool SignalExternalCommandLineArgs(IList<string> args)
{
    this.MainWindow.Activate();
    this.MainWindow.Tag = args.Count > 0 ? args[1] : "";
    return true;
}

Это позволяет мне передать путь к файлу, с которым я пытаюсь что-то сделать, непосредственно в мое MainWindow, чтобы после загрузки всего я мог пойти дальше и открыть его. Я ненавижу тот факт, что я использовал атрибут Tag для этого, поскольку он просто не выглядит правильным. Есть альтернативы?

0 ответов

Другие вопросы по тегам