2014-01-16 3 views

ответ

-1

Не поддерживается напрямую.

Что вы можете сделать, это иметь два отдельных приложения, одну форму и одну консоль. Запустите консоль один из формы и передайте данные между приложениями. Если вы хотите, чтобы установить форму, чтобы быть «внутри» консольное приложение вы можете использовать

http://msdn.microsoft.com/en-us/library/aa984420%28v=vs.71%29.aspx

+0

Что вы подразумеваете под «не поддерживаемым напрямую»? Добавьте ссылку на 'System.Windows.Forms', а затем запишите в консольном приложении:' System.Windows.Forms.Form f = new System.Windows.Forms.Form(); f.ShowDialog(); ' – Spook

+0

Вопрос сформулирован как« Как создать форму окна с помощью консольного приложения? » Вы не можете сделать это напрямую. И вы не можете связать их вместе как одно окно, но вы можете (как я уже указывал) сделать иллюзию этого. Редактировать: Я не должен говорить, что вы не можете, возможно, это возможно, но не настолько, насколько мне известно, каких-либо обычных средств. – Emz

+0

Что может быть более условным от создания экземпляра формы и вызова ShowDialog? Вы даже можете просто добавить Windows Form в проект консоли и отредактировать его в VS-дизайнере. Я не вижу, что здесь «не поддерживается напрямую». «Необычно», может быть. BTW наоборот требует ~ 1 строки кода (добавление поддержки консоли в WF-приложение) – Spook

0

Во-первых, вы должны понять, как окна в Windows, работает. Каждая оконная программа управляет тем, что называется очередью сообщений. Сообщения - это информация из системы (и других приложений), что-то произошло, например, кто-то нажал клавишу или переместил мышь, чтобы окно могло нормально реагировать на это действие пользователя.

Обработка сообщений (в том числе отправка их в соответствующее окно) является ответственностью программы, а в приложениях Windows Forms выполняется в приложении Application.Run (или где-то рядом с ним) с помощью некоторого внутреннего цикла обработки сообщений. Но если вы хотите отобразить окно в своем консольном приложении, кто-то должен взять на себя ответственность за этот процесс, иначе окно будет работать неправильно (на самом деле они вообще не будут работать).

Если отобразить окно модально, он будет обрабатывать сообщения, поступающие в нее сам по себе, так что вы можете позвонить непосредственно myWindow.ShowDialog из вашего кода, и это будет работать - но заблокирует консоль вход прочь, пока окно не будет закрыто. Это означает, что вы сможете отправить текст на консоль Console.WriteLine, но вы не сможете - например, запросить у пользователя текст по Console.ReadLine, пока окно не будет закрыто.

class Program 
{ 
    public static void Main(string[] args) 
    { 
     System.Windows.Forms.Form f = new System.Windows.Forms.Form(); 
     f.Click += (o, e) => { Console.WriteLine("Clicked!"); }; 
     f.ShowDialog(); 
     Console.ReadLine(); 
    } 
} 

// (run, then click on a form to observe result) 

Если, с другой стороны, вы хотите отображать окно в недиалоговом режиме, все становится сложнее. Самое простое, что приходит на ум - создать приложение Windows Forms и использовать AllocConsole для создания отдельного окна консоли для приложения (например, Blender делает это). Другой вариант - создать два разных приложения: консоль и Windows Forms, запустить второй из первого и управлять своим сообщением каким-то механизмом (именованные каналы, общая глобальная память, сообщения Windows, TCP/IP и т. Д.)

Смежные вопросы