Замена точки входа WPF - PullRequest
52 голосов
/ 27 мая 2011

WPF определяет свой собственный метод Main().Как мне заменить его собственным методом Main, который (обычно) открывает WPF MainWindow (например, чтобы добавить режим сценариев не-WPF через аргументы командной строки)?

Ответы [ 5 ]

51 голосов
/ 27 мая 2011

В некоторых примерах показано изменение действия App.xaml Build Action с ApplicationDefinition на Page и запись собственного Main(), который создает экземпляр класса App и вызывает его метод Run(), но это может привести к нежелательным последствиям.разрешение ресурсов приложения в App.xaml.

Вместо этого я предлагаю создать свой собственный Main() в своем собственном классе и установить для этого объекта запуска в свойствах проекта:

public class EntryPoint {
    [STAThread]
    public static void Main(string[] args) {
        if (args != null && args.Length > 0) {
            // ...
        } else {
            var app = new App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

Я делаю это, чтобы воспользоваться некоторыми AppDomain событиями, на которые необходимо подписаться, прежде чем что-либо еще произойдет (например, AssemblyResolve).Нежелательные последствия установки в App.xaml значения Page, с которым я столкнулся, включали UserControl Views (MV-VM), не разрешающие ресурсы, хранящиеся в App.xaml во время разработки.

20 голосов
/ 27 мая 2011

Обычно я редактирую App.xaml, чтобы добавить эту поддержку:

<Application x:Class="SomeNamespace.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Startup="Application_Startup">

Соответствующая часть, которую я изменил с StartupUri на Startup с обработчиком событий в App.xaml.cs.Вот пример:

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        int verbose = 0;
        var optionSet = new OptionSet
        {
            { "v|verbose", "verbose output, repeat for more verbosity.",   
                    arg => verbose++ }
        };

        var extra = optionSet.Parse(e.Args);
        var mainWindow = new MainWindow(verbose);
        mainWindow.Show();
    }
}
16 голосов
/ 29 апреля 2014

парни Проблема в том, что в вашей программе есть два статических метода Main (), которые заставят компилятор жаловаться между ними;Чтобы решить эту проблему, попробуйте выполнить одно из следующих действий:

  • Скажите компилятору, что ваш статический метод Main () должен быть точкой входа в выполнение. Установите настройку «Startup object» вашего проекта на класс, содержащий ваши статическиеМетод Main () (щелкните правой кнопкой мыши проект в обозревателе решений, выберите «Свойства», а затем найдите параметр «Объект запуска» на вкладке «Приложение»).
  • Отключение автоматической генерации приложенияСтатический метод Main () .g.cs - в обозревателе решений щелкните правой кнопкой мыши файл App.xaml, выберите «Свойства», затем измените «Действие сборки» с «ApplicationDefinition» на «Страница».
4 голосов
/ 16 февраля 2013

Создайте новый класс с вашим пользовательским статическим методом Main. В конце этого метода просто вызовите оригинальный App.Main (), сгенерированный WPF:

public class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        // Your initialization code
        App.Main();
    }
}

Затем установите настройку «Startup object» вашего класса в класс, содержащий статическую функцию Main ().

0 голосов
/ 05 августа 2015

Используя пользовательскую функцию Main (), вы можете столкнуться с проблемами, поскольку StartupUri не установлен.

Вы можете использовать это, чтобы установить его без головной боли в вашем классе приложения (не забудьте удалить StartupUri из App.xaml и установить его действие сборки на страницу):

[STAThread]
static void Main()
{
    App app = new App();
    app.InitializeComponent();
    app.Run();
}

protected void OnStartup(object sender, StartupEventArgs e)
{
        var toUri = new UriTypeConverter();
        StartupUri = (Uri)toUri.ConvertFrom("MainWindow.xaml");
...
}
...