Обработка событий формы без приложения - PullRequest
0 голосов
/ 09 марта 2012

У меня есть форма 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:

«Приложение» означает одно-приложение - у меня его нет.

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

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

Редактировать # 2:

Вот пример, который можно скомпилировать - метод обновления обновляет мое окно, но я не могу редактировать текстовое поле - не обращайте внимания на кнопку или то, что я буду делать дальше с текстом. Я даже не могу редактировать текст.

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();
            }
        }
    }
}

Редактировать # 3

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

Ответы [ 3 ]

1 голос
/ 09 марта 2012

Насколько я понимаю, вы пытаетесь открыть форму для пользователя и попросить его ввести текст. Не делайте бесконечный цикл, это не сработает. 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;
}
0 голосов
/ 05 апреля 2012

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

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

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

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

0 голосов
/ 09 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...