WPF – zaczynamy zabawę! – metoda Main()

27 Kwietnia 2016

Prawdę mówiąc dotychczas stworzyłem jedną aplikację w WPF-ie. Prosta gra w kamień-papier-nożyce po LAN-ie. Nie wymagała ode mnie żadnej wiedzy o tym jak się tworzy aplikacje okienkowe w XAMLu, bo miała minimalny interfejs, który wyklikałem.

Z SharpOffice’m sprawa będzie wyglądała zupełnie inaczej. Po pierwsze ograniczę ilość XAMLa do minimum, ponieważ będę chciał dynamicznie generować zawartość okna. Jestem jednak prawie przekonany, że będę musiał napisać swoją kontrolkę (albo kilka) i tam XAML okaże się niezbędny. Będę miał również okazję pobawić się stylami, które, z tego co czytałem, potrafią zdziałać cuda.

Ale zanim to wszytko się ogarnę, trzeba jakoś tę aplikację uruchomić.

Po pierwsze po utworzeniu nowego projektu widzimy App.xaml oraz MainWindow.xaml wraz z odpowiadającymi im plikami *.cs. No i gdzie jest void Main()? A no nie ma. A dokładniej jest automatycznie generowana w czasie kompilacji i domyślnie wygląda tak:

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

Trochę ,,upiększyłem” powyższy kod, usuwając nadmiarowe elementy (np. słowo Attribute i namespace’y) ale sens jest zachowany. Do tego mamy generowaną metodę

public void InitializeComponent() {
    ...
    this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);
    ...
}

Czyli wskazuje na MainWindow.xaml jako pierwszą rzecz, która ma się nam pokazać.

No dobra, ale może ja chcę mieć własny Main()? Z argumentami i zwracający inta. No więc napisałem go (a dokładniej przekopiowałem z wcześniejszego projektu (tego na Xwt)). Aczkolwiek kompilator nadal generuje swoją metodę.

Czas zmienić ,,entry point” naszej aplikacji. Aby to zrobić wchodzimy we właściwości projektu i zmieniamy Startup Object na klasę, która zawiera Main(). Przy czym jeśli umieściliśmy nasz Main(string[]) w tej domyślnej klasie App to dostaniemy błąd o więcej niż jednym wejściu da naszej aplikacji. Dlaczego? Ponieważ ta domyślna metoda Main() jest nadal generowana.

Aby to zmienić należy otworzyć okno właściwości dla App.xaml, zmienić Build Action na Page i wszystko będzie śmigać.


Uwaga: jeśli mamy tylko jedną metodę Main() to nie musimy deklarować Startup Object we właściwościach projektu, bo zostanie ona znaleziona automatycznie przez runtime.