У WPF немає головного ()?


128

Я початківець, коли йдеться про програмування, але я був впевнений, що одним із універсальних правил є те, що програма починається з Main (). Я не бачу такого, коли створюю проект WPF. Майн () просто назвав щось інакше у WPF?


13
Ви можете отримати еквівалентну функціональність, замінивши OnStartup в App.xaml.cs. StartupEventArgs.Args містить аргументи командного рядка.
Фул

1
@Foole, ні, ви не можете, перегляньте це питання.
Сінатр

Відповіді:


73

Він генерується під час збирання, але ви можете надати власне (розставляючи його у властивостях проекту, якщо це необхідно). Знайдіть у obj / debug файл програми; Я (люб’язно наданий "C # 2010 Express") App.g.i.csз:

namespace WpfApplication1 {


    /// <summary>
    /// App
    /// </summary>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
    public partial class App : System.Windows.Application {

        /// <summary>
        /// InitializeComponent
        /// </summary>
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public void InitializeComponent() {

            #line 4 "..\..\..\App.xaml"
            this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);

            #line default
            #line hidden
        }

        /// <summary>
        /// Application Entry Point.
        /// </summary>
        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public static void Main() {
            WpfApplication1.App app = new WpfApplication1.App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

1
Те ж саме існує App.g.csі в. Але я намагався додати, Main()і кожного разу, коли я будувати свій проект, він повернеться до того, що у вас є, тут. Спробував створити свій власний в іншому класі, але властивості проекту знаходять лише MyProject.App, а не інший клас, тому не можу перенаправити його.
vapcguy

1
Як варіант, відкрити App.xaml.csу візуальній студії. Скористайтеся панеллю навігації> Спадний список методів> виберіть Main(сірим). Це веде вас до App.g.i.cs.
P.Brian.Mackey

136

Метод Main () створюється автоматично. Якщо ви хочете надати своє, вам належить (тестувати в VS2013 та VS2017):

  • Клацніть правою кнопкою миші App.xaml у провіднику рішень, виберіть Властивості
  • Змініть "Дія збірки" на "Сторінка" (початкове значення - "ApplicationDefinition")

Потім просто додайте метод Main () до App.xaml.cs. Це могло бути так:

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

2
[STAThread] встановлює модель потоку COM для вашої програми. Зазвичай ви просто встановите його на STA і не потрібно хвилюватися, що він робить саме. Якщо ви зацікавлені, перегляньте msdn.microsoft.com/de-de/library/…
Андреас

Не робіть цього! Це назавжди порушить StaticResources, визначені в App.xaml у стилях у Дизайнері для всього проекту.
Хімбер

13

Main() автоматично надається CLR та WPF.

Компілятор C # приймає комутатор командного рядка, /mякий визначає тип, який містить реалізацію Main(). За умовою, якщо жоден об'єкт запуску прямо не вказаний, CLR шукає будь-який клас, у якого є статичний Main()метод, і викликає його. (Як зазначив @Marc Gravel у своєму коментарі)

Що стосується WPF, то Main() автоматично створюється, коли App.xamlвбудований і вказується перемикач / m, щоб компілятор C # використовував цей клас як точку входу. Якщо ви подивитеся на властивості проекту, ви побачите, що вам потрібно встановити вибір об’єкта запуску. Тож якщо хочете, ви можете надати власний клас, який реалізує Main().

Зауважте, що це покладе на вас відповідальність за створення Applicationекземпляра та виклик його Run()методу, щоб забезпечити належний запуск інфраструктури WPF.


Насправді, без /mцього не байдуже, як називається тип; якщо ви не явні, він просто намагається знайти будь-який підходящий Mainметод, і скаржиться, якщо він знаходить 0 або більше одного. Як приклад, зразок "Hello World" у мовній специфікації (§1.1) використовується Helloяк назва типу.
Марк Гравелл

2
Щоб бути педантичним: не дуже точно сказати, що main()це надає CLR (час виконання), це справді компілятор, який генерує його.
Хенк

Додав мій +1, щоб нагадати аудиторії, яку їм доведеться додати у власному екземплярі програми (тобто MyApp.App app = new MyApp.App();) та зателефонувати .Run()на нього, як і раніше Main(). Гарний дзвінок. Крім того, доведеться додати app.InitializeComponent();раніше app.Run(), і на щастя для нас, оригінальний InitializeComponent()метод все ще є (бачимо в App.g.cs, тому немає необхідності додавати цю спинку!).
vapcguy

7

Main()генерується під час компіляції. Ви можете знайти його App.g.csobj/{Debug,Release}папці).


6

main()є стандартною точкою входу для програми, але всі програми структуровані таким чином. У проекті XAML файл App.XAML вказує точку входу, де він пише StartupUri="MainWindow.xaml".

Як зазначають інші, фактична основна функція формується на основі вмісту файлів XAML у проекті.


1

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

Для мене потрібно було зробити протилежний підхід до Андреаса Калера, щоб виправити:

Після створення віконного файлу та встановлення uri для запуску цього файлу я переключив сторінку на ApplicationDefinition властивості App.xaml 'Build Action'.


0

Якщо ви видалили App.xaml та MinWindow.xaml за замовчуванням, краще відредагуйте .csproj Після додавання App.xaml вручну ваш .csproj буде:

<Page Include ="App.xaml">
       <DependentUpon>MSBuild:Compile</DependentUpon>
       <SubType>Code</SubType>
</Page>

Змініть це на:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.