Aplikacja WPF z oknem konsoli

Czasami zachodzi potrzeba stworzenia aplikacji okienkowej z oknem konsoli w tle. Może ona służyć np. do łatwiejszego śledzenia poczynań programu, co w rezultacie pozwala na łatwiejsze znajdowanie błędów w kodzie. Po stworzeniu pustego projektu WPF App i jego kompilacji domyślnie konsola nie jest wyświetlana. Można jednak temu zaradzić. Wpis opisuje sposób rozwiązania tego problemu w Visual Studio, jednak w innych IDE też powinien działać.

Tworzymy nowy projekt

Pierwszą rzeczą jaką należy zrobić, jest utworzenie nowego pustego projektu typu Console Application. Nazwijmy go np. WPFConsole

1

Dodajemy referencje

Kiedy projekt zostanie utworzony musimy dodać potrzebne do działania WPF referencje. Są to: PresentationCore, PresentationFramework, oraz System.Xaml. W tym celu klikamy PPM na References i wybieramy opcję Add Reference. Z listy wybieramy wyżej wymienione pozycje.

2

 

Dodajemy nowe okno

Tutaj może pojawić się mały problem… Dlaczego? Z tego powodu, że po kliknięciu PPM na naszym projekcie i wybraniu Add->New Item->WPF znajdziemy tylko pozycję User Control, ani śladu po czymś takim jak Window. Jednak to żaden problem. Dodajmy element tego typu do projektu i nazwijmy go MainWindow.

5

Modyfikujemy kod User Control

Aby nasze User Control stało się Window, musimy wprowadzić zmiany w kodzie. W tym celu należy usunąć cały kod XAML, który został wygenerowany przy tworzeniu naszej kontrolki. Zastępujemy go takim kodem:

Po tej operacji, modyfikujemy jeszcze kod MainWindow.cs, zamieniając:

na

Program na tym etapie powinien się już bez problemu kompilować.

Wyświetlamy nasze okno

Ostatnim etapem jest umieszczenie w funkcji Main naszego programu kodu, który wyświetli okno:

Należy zwrócić uwagę, aby na początku występowała linijka [STAThread]. Bez niej nasz program nie uruchomi się, gdyż wątek wyświetlający okno musi być typu STA.

Wyświetlanie tekstu w konsoli

Tekst w konsoli wyświetlamy standardowo poprzez Console.WriteLine(). Wystarczy umieścić tego typu linijkę w dowolnym fragmencie kodu zawartego w klasie MainWindow, a tekst zostanie wyświetlony w konsoli. Przykład:

 

To by było na tyle 😉 Teraz możemy się cieszyć okienkowym programem, razem z konsolą w tle.

661 total views, 1 views today

7 przemyśleń nt. „Aplikacja WPF z oknem konsoli

  1. Prościej jest utworzyć projekt WPF Application, następnie wejść w Properties’y projektu i wybrać Output type na Console Application.

    Wydaje mi się to dużo prostsze 😉

    • Ahh… Faktycznie, działa… Dzięki za zwrócenie uwagi! Mogłem to sprawdzić jeszcze przed napisaniem tego całego wywodu 😛
      Jednak kiedy pierwszy raz napotkałem na ten problem używałem chyba VS2013. Zmiana Output type, nie przynosiła zamierzonego efektu. Nie mam pojęcia dlaczego, może coś z VS było nie tak 😛 Zresztą wtedy dopiero zaczynałem z programowaniem… i jakoś wpadłem na taki oto sposób rozwiązania tego problemu.

      No cóż, niech to więc będzie taka ciekawostka jak zrobić to inaczej 😀
      PS: Przychodzi mi tutaj jeszcze tylko jedno zastosowanie tego „sposobu” uruchamiania aplikacji WPF. Można łatwo przekazać „konsolowe” argumenty z funkcji Main do naszego okna 😉

    • Chodzi tylko o wyświetlanie np. logów działania programu w konsoli, która działa w tle. O nic więcej o nic mniej. Fakt, można to zrobić prościej, jak wskazał ktoś wyżej. Mój błąd 😉

      • Przede wszystkim jaki jest sens tworzenia do tego konsoli… debugowanie to raz, a jak koniecznie chcesz logi to już lepiej skorzystać z czegoś do logowania w stylu NLoga. W najgorszej sytuacji masz też okno konsoli w trybie Trace albo Debug… także ta konsola to na prawdę najbardziej prymitywne co można wymyśleć.

        • Nikomu nie każe z tego korzystać. Jeżeli komuś się przyda to bardzo dobrze, jeżeli nie – można to potraktować jako zwykłą ciekawostkę 😉
          PS: Jedak konsola trybu Debug to coś innego, taką jak wyżej możemy zostawić w aplikacji na stałe – oczywiście jeżeli chcemy. Można też to zmodyfikować tak, żeby konsola pojawiała się tylko wtedy kiedy uruchomimy program z jakimś tam parametrem. Taki tryb Debug, ale bez debugera 😉

Możliwość komentowania jest wyłączona.