как изменить "this.ShowInTaskBar" для "form.ShowDialog ()", оставив его открытым? - PullRequest
5 голосов
/ 06 марта 2010

если вы запустите этот фрагмент кода (поместите его в 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 закроется.

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

Ответы [ 4 ]

4 голосов
/ 06 марта 2010

Это невозможно.Я на самом деле подал сообщение об ошибке об этом на сайте обратной связи Microsoft, но они перевернули мне эту птицу.

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

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

2 голосов
/ 06 марта 2010

Вы оставляете его открытым, устанавливая 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 () было просто тестовым кодом, не беспокойтесь об этом. Проблема исчезнет, ​​когда форма будет запущена на главном насосе приложения.

0 голосов
/ 06 марта 2010

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

эта работа

    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 голосов
/ 06 марта 2010

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

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

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