2012-03-09 3 views
0

У меня есть форма для Windows, не запускающая ее в приложении.Обработка формы событий без приложения

Это основная функция, которую я должен вызывать в форме ... есть некоторые переменные класса, единственное, действительно важное - это закрытие. пользователь должен нажать кнопку, чтобы закрыть окно.

К сожалению, я не могу его обновить и обработать. this.Update(), this.Refresh() обыкновение делать трюк.

internal short ask(String question, String RegExFilter, out String answer) 
    { 
     this.RegExFilter = RegExFilter; 
     this.Text = question; 

     this.Show(); 
     while (!closingpermission) 
     { 
      //Window needs to process its events and allow the user to interact. 
     } 
     answer = answerBox.Text; 
     this.Close(); 
     return RetVal; 
    } 

EDIT:

"Применение" означает одноплодное приложение - я не имею, что.

Петля должна сохранять форму отображаемой - я думаю, что soution - это что-то Hans Passant. Мне нужно перекачать контур сообщения.

Решение Ken2K не работает для меня.

Edit # 2:

Вот compileable пример - Митос обновление обновляет мое окно, но я не могу изменить текстовое поле - фигу о кнопке или то, что я буду делать дальше с текстом. Я даже не могу отредактировать текст.

using System.Windows.Forms; 
using System.Drawing; //System.Drawing.dll 

namespace StackOverFlowDemo 
{ 
    class Example 
    { 
     public static void Main() 
     { 
      Input input = new Input(); 
      input.Ask("Something"); 
     } 
    } 

    class Input : Form 
    { 
     TextBox textbox = new TextBox(); 

     public Input() 
     { 
      this.Controls.AddRange(new Control[] { textbox }); 
      this.Bounds = new Rectangle(0, 0, 500, 500); 
      this.textbox.Bounds = new Rectangle(10, 10, 480, 200); 
     } 

     internal void Ask(string question) 
     { 
      this.Text = question; 
      this.Show(); 
      while (true) 
      { 
       this.Update(); 
      } 
     } 
    } 
} 

Edit # 3

Я думаю, что я хочу, не может быть сделано. Я прочитал тему, и вам кажется, что вам нужно «что-то», которое вызывает protected override void WndProc(ref Message m); все время. Это что-то кажется Приложением. Я не знаю, как это сделать в приложении, которое не имеет приложения. Пожалуйста, не соглашайтесь со мной :)

+0

не понимаю.Что значит «без приложения»? – Steve

+2

Очевидно, что это не работает, потому что у вас нет приложения. Звонок Application.Run() необходим для сохранения форм в живых, он накачивает цикл сообщений. Или Form.ShowDialog(). –

+0

Посмотрите на [этот вопрос] (http://stackoverflow.com/questions/4721962/c-sharp-application-run-without-form) и на принятый ответ. – Steve

ответ

0

Одним из первых комментаторов были его Rigth из начало.

Очевидно, что это не работает, потому что у вас нет «приложения». Для сохранения форм в памяти требуется вызов Application.Run(), он передает цикл сообщений . Или Form.ShowDialog(). - Ханс Passant 9 марта в 12:34

Если вы хотите использовать Froms вы также должны использовать приложение - я вы не хотите использовать приложение, которое вы должны переключиться на другие рамки для визуализации, как XNA в качестве примера ,

Примите, что в вашем приложении есть одноэлемент и используйте приложение.

0

Простым решением будет использование Application.DoEvents();, но я немного смущен вашим названием.

+1

'Application.DoEvents()' является грязным обходным решением, которое обычно только ** скрывает ** проблемы, но * не исправляет их *. Избегайте 'DoEvents()' как можно больше, это часто является источником злых ошибок. – ken2k

+0

У меня была Application.DoEvents(); там, в другой среде, - но у меня больше нет этого глобального «Приложения», поэтому я не могу ничего называть. – Johannes

1

Из того, что я понимаю, вы пытаетесь вывести форму пользователю и попросить его ввести текст. Не делайте бесконечный цикл, это не сработает. Update и Refresh тоже бессмысленны.

Вы можете использовать модальную форму (часто предпочтительную для всплывающего окна, которое запрашивает значение для пользователя) и Cancel свойства FormClosingEventArgs:

public partial class Form2 : Form 
{ 
    private bool preventClose = true; 

    public string ResultString 
    { 
     get 
     { 
      // Returns the content of a textbox 
      return this.textBox1.Text; 
     } 
    } 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     // Closes only when button1 is clicked 
     this.preventClose = false; 
     this.Close(); 
    } 

    private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     e.Cancel = this.preventClose; 
    } 
} 


using (Form2 frm = new Form2()) 
{ 
    frm.ShowDialog(); 

    string res = frm.ResultString; 
} 
Смежные вопросы