if (this.WindowState == FormWindowState.Minimized)
this.owner.WindowState = FormWindowState.Minimized;
дочерние диаолговые окна
требуется сделать дочернее диалоговое окно (форма, с прогрессбаром)
и чтоб нельзя было перейти на хозяина (owner) пока это окно существует.
получается что-то вроде ShowDialog()
но есть одно НО. когда мы сворачиваем modaldialog, то форма-хозяин остается. а если сделать что-то вроде:
Код:
то будет считаться, что дочернее диалоговое окно было закрыто.
пример желаемого окна можно посмотреть в Total Commander.когда идет закачка файла.
подскажите как можно решить данную проблему?
пробовал эксперементировать с Activated:
Код:
private void Form1_Activated (object sender, EventArgs e)
{
if (this.OwnedForms.Length > 0)
{
this.OwnedForms[0].Focus();
}
}
{
if (this.OwnedForms.Length > 0)
{
this.OwnedForms[0].Focus();
}
}
Код:
Form2 form = new Form2();
form.ShowDialog();
form.ShowDialog();
Если свернуть эту форму - главное окно также свернётся.
Полагаю у тебя она только и делает, что демонструрует прогресс какой-то фоновой операции.
Когда операция завершится, ты просто скажешь form.Dispose() или form.Close() и оно благополучно сдохнет.
З,Ы, не забудь поставить свойство ShowInTaskBar как false
только вот ещё одна проблема:
Есть главная форма (MainForm)
она открывает какую-то дочернюю форму (ChildForm)
а ChildForm открывает Settings (как Modal, т.е. ShowDialog)
---
получается, что пока не закроешь Settings получить доступ к ChildForm и MainForm нельзя. а надо чтоб MainForm было независимой..
Цитата: bmn
hardcase, спасибо.
только вот ещё одна проблема:
Есть главная форма (MainForm)
она открывает какую-то дочернюю форму (ChildForm)
а ChildForm открывает Settings (как Modal, т.е. ShowDialog)
---
получается, что пока не закроешь Settings получить доступ к ChildForm и MainForm нельзя. а надо чтоб MainForm было независимой..
только вот ещё одна проблема:
Есть главная форма (MainForm)
она открывает какую-то дочернюю форму (ChildForm)
а ChildForm открывает Settings (как Modal, т.е. ShowDialog)
---
получается, что пока не закроешь Settings получить доступ к ChildForm и MainForm нельзя. а надо чтоб MainForm было независимой..
Есть вариант, в котором мы ChildForm создаём в новом потоке (Thread) и тогда ShowDialog будет воздействовать на ту форму. Думаю этот вариант тебе не слишком подойдёт - там есть проблемы с доступом к окнам между потоками.
Другой вариант - форма SettingsForm знает о форме, которая её вызвала, и на время своего отображения на экране элементарно блокирует caller-форму:
Код:
public partial class SettingsForm : Form {
private Form callerForm;
public SettingsForm(Form callerForm) {
InitializeComponent();
this.callerForm = callerForm;
}
private void SettingsForm_Load(object sender, EventArgs e) {
if(callerForm != null)
callerForm.Enabled = false;
}
private void SettingsForm_FormClosed(object sender, FormClosedEventArgs e) {
if(callerForm != null)
callerForm.Enabled = true;
}
}
private Form callerForm;
public SettingsForm(Form callerForm) {
InitializeComponent();
this.callerForm = callerForm;
}
private void SettingsForm_Load(object sender, EventArgs e) {
if(callerForm != null)
callerForm.Enabled = false;
}
private void SettingsForm_FormClosed(object sender, FormClosedEventArgs e) {
if(callerForm != null)
callerForm.Enabled = true;
}
}
Чтобы создать эту форму мы должны передать параметр-форму, в контексте которой мы вызывам Settings-окно:
Код:
private void button1_Click(object sender, EventArgs e) {
SettingsForm settingsForm = new SettingsForm(this);
settingsForm.Show();
}
SettingsForm settingsForm = new SettingsForm(this);
settingsForm.Show();
}
Код:
[LEFT][FONT=Courier New]private void button1_Click(object sender, EventArgs e) [/FONT]
[FONT=Courier New]{
SettingsForm settingsForm = new SettingsForm();
settingsForm.Owner = this;[/FONT]
[FONT=Courier New] settingsForm.Show();
}[/FONT][/LEFT]
[FONT=Courier New]{
SettingsForm settingsForm = new SettingsForm();
settingsForm.Owner = this;[/FONT]
[FONT=Courier New] settingsForm.Show();
}[/FONT][/LEFT]
Или так (используя интерфейс IWin32Window):
Код:
[LEFT][FONT=Courier New]private void button1_Click(object sender, EventArgs e) [/FONT]
[FONT=Courier New]{
SettingsForm settingsForm = new SettingsForm();[/FONT]
[FONT=Courier New] settingsForm.Show(this);
}[/FONT][/LEFT]
[FONT=Courier New]{
SettingsForm settingsForm = new SettingsForm();[/FONT]
[FONT=Courier New] settingsForm.Show(this);
}[/FONT][/LEFT]
обьясню по порядку:
создается MainForm, нажимаем на иконку, открывается ChildForm и есть настройка ChildForm'а - SettingsForm.
Так вот этот SettingsFrom вызываем типа
SettingsForm s = new SettingsForm();
s.ShowDialog (this);
из ChildForm.
получаем следующую ситуацию:
нельзя получить доступ, ну т.е. открыть там другие формы (из MainForm), MainForm и ChildForm. Я хочу чтоб эта НЕДОСТУПНОСТЬ (что-ли) действовало только на ту форму, которая вызывает ShowDialog, а MainForm осталась независимой. Она как коллекция программ идет, из неё вызвать можно будет другие формы.
Реально такое?
--
конечно есть вариант, типа из MainForm открывать exe'шные апликухи, но как тогда сделать, чтоб они принадлежали MainForm, и закрылись, когда я закрою MainForm.
Просто держать массив открытых программ, а при закрытии главной программы завершить эти процессы?
Цитата: bmn
s.ShowDialog (this);
А теперь покажи, где в коде, что я тебе запостил, есть подобный вызов?
Цитата: hardcase
А теперь покажи, где в коде, что я тебе запостил, есть подобный вызов?
извини, не совсем так сначала понял. ты типа имитируешь свой ShowDialog..?
а можно просто сделать так, чтобы события форм, которые вызываются методом Show(), без указаний owner'a не влияли на форму. Чтоб она была независимоЙ!!?