Вопрос по winforms, c# – Как отключить родительскую форму, когда активна дочерняя форма?

68

Как отключить родительскую форму, когда дочерняя форма активна с помощью C #?

Не можете ли вы просто использовать ChildForm.show, затем Mainform.disable / .hide или вы говорите о том, чтобы одновременно активными были 2 формы, а когда дочерняя форма активна (отключена основная), затем включена (не фокусирована), повторно активируйте mainforM ? Don Thomas Boyle
@DonThomasBoyle: эй, мужик, я ищу именно твоё описанное решение, в котором одновременно активны 2 формы, а когда дочерняя форма (активна для отключения основной), то включена (не фокусируется), повторно активируй mainforM & quot; Вы можете дать мне подсказку, как решить это? я пробовал это с помощью threading, application.run и т. д., но ничего не работает. как бы вы поняли это? melodia

Ваш Ответ

13   ответов
37

Ты звонишьShowDialog() или простоShow() на вашей детской форме от родительской формы?

ShowDialog будет "блокировать" пользователь от взаимодействия с формой, которая передается в качестве параметраShowDialog.

Внутри родителя вы можете назвать что-то вроде:

MyChildForm childForm = new MyChildForm();

childForm.ShowDialog(this);

гдеthis это родительская форма.

Работает для меня! Версия VB.Net это:Public childForm As New Childformclass а такжеchildForm.ShowDialog(Me) где Me - родитель класса (родительская форма) большое спасибо @Philip
15

Это просто, использовать

  Form.ShowDialog();

Вместо

  Form.Show();

При использованииForm.ShowDialog()вы не можете взаимодействовать с родительской формой, пока она не закроется.

когда я пытаюсь это найти, то это скрывает это
0

Если вы просто пытаетесь смоделировать вызов Form.ShowDialog, но БЕЗ блокирования чего-либо (что-то вроде формы смоделированного диалога), вы можете попробовать использовать Form.Show () и, как только вы отобразите форму смоделированного диалогового окна, немедленно отключите все другие окна, используя что-то вроде...

private void DisableAllWindows()
{
foreach (Form f in Application.OpenForms)
if (f.Name != this.Name)f.Enabled = false;
else f.Focus();
}

Затем, когда вы закроете свою «псевдо-диалоговую форму» обязательно позвони ....

private void EnableAllWindows()
{
foreach (Form f in Application.OpenForms) f.Enabled = true;
}
9

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

  Form newForm = new ChildForm();
  newForm.Show(this);

Затем в дочерней форме установите обработчики событий дляActivated а такжеDeactivate События:

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

private void Form_Deactivate(object sender, System.EventArgs e)
{
    if (this.Owner != null)
    {
        this.Owner.Enabled = true;
    }
}

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

Если вы хотите сделать детскую формумодальныйиспользоватьShowDialog вместо:

  Form newForm = new ChildForm();
  newForm.ShowDialog(this);
Вы также можете обрабатывать Form_Closed вместо Form_Deactivate, если вы хотите отключить родительскую форму на время жизни дочерней формы, независимо от того, какие другие формы или приложения были активированы в это время.
-2

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

// Execute child process
System.Diagnostics.Process proc = 
    System.Diagnostics.Process.Start("notepad.exe");
proc.WaitForExit();
-1: не смей делать это в обработчиках click / press / mouse / key. Информация:stackoverflow.com/questions/470256/…
Этот ответ о ПРОЦЕССАХ, а не о ФОРМАХ. Полезно для кого-то, но не решает вопрос. Это также очень плохая идея, если сделать это в потоке графического интерфейса - графический интерфейс вашего приложения будет заблокирован до тех пор, пока не завершится другой процесс - если что-то пойдет не так, пользователю придется прибегнуть к диспетчеру задач для уничтожения вашего приложения. ИСПОЛЬЗУЙТЕ С ОСТОРОЖНОСТЬЮ! Или даже лучше: используйте какое-нибудь АСИНХРОННОЕ решение, а не WaitForExit.
3

Вы можете сделать это с помощью следующего:

Form3 formshow = new Form3();

formshow.ShowDialog();
179

Вы пытались использоватьForm.ShowDialog () вместоForm.Show ()?

ShowDialog показывает ваше окно как модальное, что означает, что вы не можете взаимодействовать с родительской формой, пока она не закроется.

Спасибо @R. Мартиньо Фернандес, это прекрасно работает!
@barlop, чтобы скрыть использование родительской формыthis.Hide() в родительском коде формы.
не скрывает ли это родительскую форму?
большое спасибо вам :)
@vee Ты неправильно меня понял. Я спрашивал, почему это казалось скрытым (когда я этого не хотел). Моя проблема решена былаstackoverflow.com/questions/38171607/…
7

Хотя использование ранее упомянутого childForm.ShowDialog (this) отключит вашу основную форму, она все еще выглядит очень отключенной. Однако, если вы вызываете Enabled = false перед ShowDialog () и Enable = true после вызова ShowDialog (), основная форма даже будет выглядеть как отключенная.

var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
Я не вижу, как это может работать ... при попытке скрыть родительскую форму
4

@Melodia

Извините за то, что это не код C #, но это то, что вы хотели бы, кроме перевода это должно быть легко.

FORM1

Private Sub Form1_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter
    Me.Focus()
    Me.Enabled = True
    Form2.Enabled = False
End Sub

Private Sub Form1_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave
    Form2.Enabled = True
    Form2.Focus()
End Sub

FORM2

Private Sub Form2_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter
    Me.Focus()
    Me.Enabled = True
    Form1.Enabled = False
End Sub

Private Sub Form2_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave
    Form1.Enabled = True
    Form1.Focus()
End Sub

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

большое спасибо! твоя идея отличная! я только что узнал, что он также работает, работая с формальными родителями и приставляя к ним детей.
4
Form1 frmnew = new Form1();
frmnew.ShowDialog();
6
ChildForm child = new ChildForm();
child.Owner = this;
child.Show();

// В ChildForm_Load:

private void ChildForm_Load(object sender, EventArgs e) 
{
  this.Owner.Enabled = false;
}

private void ChildForm_Closed(object sender, EventArgs e) 
{
  this.Owner.Enabled = true;
} 

источник :http://social.msdn.microsoft.com/Forums/vstudio/en-US/ae8ef4ef-3ac9-43d2-b883-20abd34f0e55/how-can-i-open-a-child-window-and-block-the- родитель окна только

2

Вы также можете использовать форму MDIParent-child. Установите родителя дочерней формы в качестве MDI Parent

Например

child.MdiParent = parentForm;
child.Show();

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

1

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

 frmUserRegistration frmMainMenu = new frmUserRegistration();
    frmMainMenu.ShowDialog(this);

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