как изменить “это. ShowInTaskBar” для “формы. ShowDialog ()” при сохранении этого открытым?

если Вы работаете, этот отрывок кода (поместите его в form1) в свежем новом приложении winform с 2 формами

    private void Form1_Load(object sender, EventArgs e)
    {
        Form2 newForm = new Form2();
        Button b = new Button();
        newForm.Controls.Add(b);
        b.Click += new EventHandler(click);
        this.Show();
        newForm.ShowDialog();

    }

    private void click(object sender, EventArgs e)
    {
        ((Form)((Control)sender).Parent).ShowInTaskbar = false;
    }

и Вы нажимаете на кнопку на новой форме (должен быть form2), form2 закроется.

Как сохранить это открытым?

5
задан Fredou 6 March 2010 в 00:58
поделиться

4 ответа

как ... мой ... это уродливый хак

эта работа

    private void Form1_Load(object sender, EventArgs e)
    {
        Form2 newForm = new Form2();
        Button b = new Button();
        newForm.Controls.Add(b);
        b.Click += new EventHandler(click);
        newForm.FormClosed += new FormClosedEventHandler(form2_closed);
        newForm.FormClosing += new FormClosingEventHandler(form2_closing);
        this.Show();
        do
        {
          newForm.ShowDialog();
        } while (newForm.IsDisposed == false );               
    }

    private void click(object sender, EventArgs e)
    {
        ((Form)((Control)sender).Parent).ShowInTaskbar = !((Form)((Control)sender).Parent).ShowInTaskbar;
    }

    private void form2_closed(object sender, FormClosedEventArgs e)
    {
        ((Form)sender).Dispose();
    }

    private void form2_closing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.None)
            e.Cancel = true;
    }
0
ответ дан 14 December 2019 в 13:33
поделиться

Вы оставляете его открытым, задав для ShowInTaskbar значение false перед ShowDialog ();

private void Form1_Load(object sender, EventArgs e)
{
    Form2 newForm = new Form2();
    Button b = new Button();
    newForm.Controls.Add(b);
    b.Click += new EventHandler(click);
    this.Show();

    // add this line of code...
    newForm.ShowInTaskbar = false; 

    newForm.ShowDialog();

}

private void click(object sender, EventArgs e)
{
    ((Form)((Control)sender).Parent).ShowInTaskbar = false;
}

Или просто не делайте вторую форму модальной. Это тоже работает.

private void Form1_Load(object sender, EventArgs e)
{
    Form2 newForm = new Form2();
    Button b = new Button();
    newForm.Controls.Add(b);
    b.Click += new EventHandler(click);
    this.Show();

    newForm.Show();
}

Я не знаю конкретного механизма здесь, но ясно, что происходит то, что изменение флага (которое фактически изменяет один или несколько стилей окна WS_EX_xxx) приводит к завершению работы модального насоса ShowDialog (). Это, в свою очередь, заставляет вас (наконец!) Выйти из Form1_Load, а затем ваша newForm выходит из области видимости и уничтожается.

Итак, ваша проблема заключается в сочетании ShowDialog () и того факта, что вы не готовы к тому, что ShowDialog () когда-либо завершится.

Теперь модальное окно для не должно отображаться со значком на панели задач, на самом деле должно быть только 1 значок на панели задач для приложения и все его модальных форм, поскольку когда модальная форма работает, основная форма все равно отключена. Когда основная форма свернута, все модальные формы, которыми она владеет, будут скрыты и т. Д.

Поэтому, если вы действительно хотите, чтобы эта вторая форма была модальной, вы не должны давать пользователю возможность предоставить ей панель задач. икона. Если использование ShowDialog () было просто тестовым кодом, не беспокойтесь об этом. Проблема исчезнет, ​​когда форма будет запущена на основном насосе приложения.

2
ответ дан 14 December 2019 в 13:33
поделиться

Ваш вопрос мне не очень понятен. В любом случае, форма newForm отображается как модальный диалог, что означает, что она блокирует работу пользователя с родительской формой, пока она не будет закрыта. Модальные диалоги обычно имеют некоторые кнопки, которые автоматически закрывают их, возвращая либо OK, либо Cancel вызывающей форме (как возвращаемое значение ShowDialog). Это делается с помощью свойства DialogResult, поэтому если это свойство установлено для вашей кнопки, это может быть причиной того, что модальная форма закрывается при нажатии на нее.

Если вы хотите показать несколько форм таким образом, чтобы пользователь мог работать с обеими, вам придется использовать диалог без модели. Вот хорошая обзорная статья на MSDN.

0
ответ дан 14 December 2019 в 13:33
поделиться

Это невозможно. На самом деле я отправил отчет об ошибке об этом на сайт отзывов Microsoft, но мне это не понравилось.

По общему признанию, это сложная проблема для решения, изменение свойства требует, чтобы Windows Forms воссоздала окно с нуля, потому что оно управляется флагом стиля. Тип, который вы можете указать только в вызове CreateWindowEx () с аргументом dwExStyle. Воссоздание окна затрудняет его модальное состояние, как того требует вызов метода ShowDialog ().

Windows Forms обходит множество ограничений User32. Но не тот.

4
ответ дан 14 December 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: