Обработка аргументов командной строки в одном приложении
У меня есть сложный вопрос относительно класса 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 для этого, поскольку он просто не выглядит правильным. Есть альтернативы?