従来のWinFormsMDIアプリケーションに取り組んでいますが、子フォームを希望どおりに動作させるのに問題があります。私の目的は、子フォームを常に最大化(ドッキング)することです。
問題は、最大化/サイズ変更ボタンを設定MaximizeBox
した場合でもfalse
、MDIツールストリップに表示され、ユーザーが子フォームのサイズを変更(ドッキング解除)できるようにすることです。これを回避する唯一の方法はに設定ControlBox
することfalse
ですが、閉じるボタンが消えます(それは私が望むものではありません)。
サイズ変更イベントが発生したときに、修正FormBorderStyle
済みの子フォームを最大化することをすでに試みましたが、どのアプローチも機能しませんでした。
私が見逃した超秘密の財産はありますか、それとも不可能ですか?
よろしくお願いいたします。
アップデート
私は自分の子フォームを処理するための卑劣な方法を書きました(@rfresiaのおかげで)、それは同じ問題に遭遇した他の人を助けるかもしれません:
//All child forms derive from ChildForm
//Parent MDI Form implementation
//...
private void ShowForm(ChildForm form)
{
//Check if an instance of the form already exists
if (Forms.Any(x => x.GetType() == form.GetType()))
{
var f = Forms.First(x => x.GetType() == form.GetType());
f.Focus();
f.WindowState = FormWindowState.Maximized;
}
else
{
//Set the necessary properties (any other properties are set to default values)
form.MdiParent = this;
form.MaximizeBox = false;
form.MinimizeBox = false;
form.WindowState = FormWindowState.Maximized;
Forms.Add(form);
form.Forms = Forms;
form.Show();
form.Focus();
//Lets make it nasty (some forms aren't rendered properly otherwise)
form.WindowState = FormWindowState.Normal;
form.WindowState = FormWindowState.Maximized;
}
}
//...
//ChildForm implementation
//...
public List<Form> Forms { get; set; }
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
Forms.RemoveAll(x => x.GetType() == GetType());
}
protected override void OnResize(EventArgs e)
{
WindowState = FormWindowState.Maximized;
}