2011-12-29 4 views
2

私のアプリケーションでは、ユーザーはあるフォームを他のフォームにナビゲートすることができます。だから私は各フォームのWindowStateを維持したい。私の平均は、form1がNormalモードであれば、次のform2はNormalモードで開き、form1が最大化モードであれば、form2は最大化モードで開くはずです。ユーザーが前のフォームにナビゲートする場合も同じアプローチが適用されます。私はMDI親子を使用していません。これを行うための.Net:異なるフォームに移動するときにフォームwindowStateを維持します。

一つの方法は、

frmLogin form = new frmLogin(); 
form.WindowState = this.WindowState; 
form.Show(); 
this.Hide(); 

を以下のようであるが、私はこのアプローチはよくないと思います。この場合、私は、

は、より良い代替

答えて

2

は、例えば(中心的な場所を持ってお勧めしてくださいすることを目的とする新しい形の近くに、以前のフォームが新しいフォームのWindowStateを占めるので、新しいフォームに、以前のフォームの参照を維持する必要がありますFormStateManagerクラス)には、すべてのフォームで使用可能なWindowState情報が格納されます。あなたのプログラム内にただ一つのFormStateManagerオブジェクトを持つためにシングルトンパターンを使うことも、すべてのFormのコンストラクタに正しいオブジェクトを渡すこともできます。 FormStateManagerオブジェクトには、フォームが変更されるたびに、たとえばResizeイベントでWindowStateが変更されたときに通知する必要があります。

0

あなたのアプローチに問題はありません。 FormWindowStateすべてのフォームの最後の「有効」(アプリケーションの観点から)状態を保持する1つの変数があります。

2

現在のWindowStateでグローバル変数(ある種の静的変数)を保持することができます。フォームのウィンドウ状態が変更されると、その変数が設定され、新しいフォーム(コンストラクタなど)を作成すると、その変数からウィンドウの状態が読み取られます。

イベントはありません。WindowStateChangedイベントです。ただし、ウィンドウの状態を変更するとResizeイベントがトリガーされるため、そのイベントを使用できます。

あなたも、基本クラスでこのすべてを置くことができます:

public class FormBase : System.Windows.Forms.Form 
{ 
    private static FormWindowState _windowState = FormWindowState.Normal; 

    public FormBase() 
    { 
     WindowState = _windowState; 
    } 

    protected override void OnResize(EventArgs e) 
    { 
     _windowState = WindowState; 

     base.OnResize(e); 
    } 
} 

をそして、あなたは本当に空想に行きたい場合は、すべてのフォームのフォームの状態を同期させることができます。

public class FormBase : System.Windows.Forms.Form 
{ 
    private static List<FormBase> _allForms = new List<FormBase>(); 
    private static FormWindowState _windowState = FormWindowState.Normal; 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     _allForms.Add(this); 

     WindowState = _windowState; 
    } 

    protected override void Dispose(bool disposing) 
    { 
     _allForms.Remove(this); 

     base.Dispose(disposing); 
    } 

    protected override void OnResize(EventArgs e) 
    { 
     _windowState = WindowState; 

     foreach (var form in _allForms) 
     { 
      if (form != this) 
      { 
       form.WindowState = WindowState; 
      } 
     } 

     base.OnResize(e); 
    } 
} 
関連する問題