Почему модальная форма полностью исчезает при минимизации? - PullRequest
1 голос
/ 03 января 2012

Я пытаюсь свести форму владельца к минимуму при минимизации модальной формы.Но когда я минимизирую модальную форму - она ​​исчезает полностью.(- Я могу нажать на форму владельца.)

Как мне решить эту проблему?

У меня есть:

public partial class Form1 : Form
{
    Form2 frm2 = new Form2();

    public Form1()
    {
        InitializeComponent();
        frm2.Owner = this;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm2.ShowDialog();
    }
}

И:

class Form2 : Form
{
    Form1 frm1;
    FormWindowState ws = new FormWindowState();

    public Form2()
    {
        SizeChanged += new EventHandler(Form2_SizeChanged);
    }

    void Form2_SizeChanged(object sender, EventArgs e)
    {
        frm1 = (Form1)Owner;
        if (WindowState == FormWindowState.Minimized) 
        { 
            ws = frm1.WindowState; 
            frm1.WindowState = FormWindowState.Minimized; 
        }
        else frm1.WindowState = ws;
    }

}

(Пытаясь это, я также столкнулся с этим: Модальная форма не появляется в трее, пока не свернута и форма владельца не нажата один раз. Как мне сделать так, чтобы она появилась? )

Ответы [ 5 ]

3 голосов
/ 03 января 2012

Это по замыслу.Как часть контракта модальности, показ диалогового окна отключает все другие окна в приложении.Когда пользователь сворачивает диалоговое окно, у него не остается окон, к которым пользователь может получить доступ.Делать приложение непригодным для использования.Winforms гарантирует, что этого не произойдет, автоматически закрывая диалоговое окно, когда оно сворачивается.

Очевидно, что вы захотите предотвратить это вообще.Установите для свойства MinimizeBox значение false.Для свойства MaximizeBox также должно быть установлено значение false, чтобы обе кнопки исчезли из заголовка окна.Оставляя комнату для справочной кнопки между прочим.

1 голос
/ 03 января 2012

Я не помню, чтобы каждый так много кода использовал для работы модальной Windows.Меня беспокоит ваш комментарий «Я могу нажать на форму владельца», которая заставляет меня поверить, что форма неправильно настроена как модальная.По определению, модальные формы должны быть обработаны до того, как пользовательский контроль сможет вернуться к форме владельца.Minimizinfg модальная форма не означает должным образом «иметь дело» с модальной формой.

Вот код, который я использовал в прошлом.Примечания: передача владельца в качестве параметра в ShowDialog устанавливает отношение владения.Хотя я подозреваю, что ваш код работает, я не использовал его таким образом.

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

public partial class Form1 : Form
{
    Form2 frm2 = new Form2();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm2.ShowDialog(this);
    }
}

Надеюсь, это поможет.

0 голосов
/ 03 августа 2015

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

MainForm.cs

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2.Show(this, "Testing 123");
    }
}

Form2.cs

public partial class Form2 : Form
{
    bool isMinimized;

    private Form2()
    {
        InitializeComponent();
        ShowInTaskbar = false;
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        if (Owner != null)
        {
            Owner.Enabled = true;
        }
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        MinimizeBox = Owner != null;
        if (Owner != null)
        {
            Owner.Enabled = false;
        }
    }

    private void Form2_SizeChanged(object sender, EventArgs e)
    {
        if (Owner != null)
        {
            if (WindowState == FormWindowState.Minimized && Owner.WindowState != FormWindowState.Minimized)
            {
                Owner.Enabled = true;
                Owner.WindowState = FormWindowState.Minimized;
                isMinimized = true;
            }
            else if (isMinimized && Owner.WindowState != FormWindowState.Minimized)
            {
                Owner.Enabled = false;
            }
        }
    }

    public static void Show(Form owner, string message)
    {
        var form2 = new Form2();
        form2.label1.Text = message;

        if (owner != null)
            form2.Show(owner);
        else
            form2.ShowDialog();
    }
}
0 голосов
/ 03 января 2012

Добавить:

Show();

В конце обработчика событий Form2.

0 голосов
/ 03 января 2012

Формы имеют свойство ShowInTaskbar.Если установлено значение false, то форма никогда не будет отображаться на панели задач, даже если она свернута.

...