У меня был тот же вопрос, и я искал похожий ответ. Я нашел информацию повсюду, поэтому я кладу то, что нашел, в одно место. Мне также нужен был способ скрыть и показать окно консоли, поэтому я обнаружил, что это работает (для VS 2013 +):
Создайте новый консольный проект (обязательно выберите нужную версию .NET Framework - мне нужно было использовать .Net 4.0 сам). Убедитесь, что у вас есть следующие ссылки:
- PresentationFramework
- PresentationCore
- WindowsBase
- System.xaml
Щелкните правой кнопкой мыши проект в обозревателе решений, выберите
«Свойства» и измените Тип вывода проекта на Приложение Windows.
Это предотвращает отображение окна консоли при запуске (если вы
хотите, пропустите этот шаг).
Хотя управление окном консоли необязательно для добавления окон WPF, это может быть полезно. Если вам это не нужно, перейдите к # 4. В классе «Program» для консоли добавьте это, чтобы управлять окном:
public class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AllocConsole(); // Create console window
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow(); // Get console window handle
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_HIDE = 0;
const int SW_SHOW = 5;
Это позволяет создавать, скрывать и отображать окно консоли. Я создал эти методы для этого:
static void ShowConsole()
{
var handle = GetConsoleWindow();
if (handle == IntPtr.Zero)
AllocConsole();
else
ShowWindow(handle, SW_SHOW);
}
static void HideConsole()
{
var handle = GetConsoleWindow();
if (handle != null)
ShowWindow(handle, SW_HIDE);
}
В основном это не требует пояснений, но если проект находится в оконном режиме, GetConsoleWindow();
возвращает null
, поэтому здесь мы проверяем, равен ли дескриптор нулю (в данном случае - нулю), и если да, нужно окно консоли быть созданным (только один раз). После этого GetConsoleWindow();
всегда возвращает дескриптор для использования.
Как уже говорилось в другом ответе, вам нужно , чтобы добавить [STAThread]
в строку перед методом Main
вашей консоли. Это необходимо, так как WPF должен работать в однопоточных квартирах .
[STAThread]
static void Main(string[] args)
{
}
Добавление окна: Чтобы сделать это, просто добавьте пользовательский элемент управления в свой проект и назовите его «MainWindow» (или как вам угодно). Просто щелкните правой кнопкой мыши узел проекта в обозревателе решений и выберите Add->User Control...
. Откройте код MainWindow.xaml.cs и измените MainWindow : UserControl
на MainWindow : Window
. Затем откройте файл MainWindow.xaml и измените первый тег <UserControl
на <Window
(и убедитесь, что закрывающий тег также переименован, что должно быть автоматически при использовании Visual Studio). Закройте все вкладки редактора «MainWindow» и откройте заново (просто чтобы убедиться, что в этом нет необходимости). Вы должны увидеть, что MainWindow.xaml теперь показывает окно на панели дизайна.
Отображение окна WPF: Для этого нам нужно запустить цикл сообщений окна, который действительно прост. Для начала я создал несколько свойств для хранения объектов. Просто поместите это где-нибудь в класс Program
.
public static Application WinApp { get; private set; }
public static Window MainWindow { get; private set; }
Затем мы должны создать цикл обработки сообщений, создав объект System.Windows.Application
, а затем передать его в главное окно. Я создал этот метод для выполнения этой задачи:
static void InitializeWindows()
{
WinApp = new Application();
WinApp.Run(MainWindow = new MainWindow()); // note: blocking call
}
и все! Чтобы проверить это, поместите некоторый контент в главное окно и сделайте следующее:
[STAThread]
static void Main(string[] args)
{
ShowConsole(); // Show the console window (for Win App projects)
Console.WriteLine("Opening window...");
InitializeWindows(); // opens the WPF window and waits here
Console.WriteLine("Exiting main...");
}