2016-05-09 9 views
0

アプリケーションからMainWindowを開くプラグインを開発しています。私はC#とWPFを使用しています。閉じるときにWPFウィンドウがヌルに設定されていません

public class StartRIR : IExternalCommand 
{ 
    private static MainWindow mainwindow; 

    public Result Execute(
     ExternalCommandData commandData, 
     ref string message, 
     ElementSet elements) 
    { 
     if (mainwindow != null) 
     { 
      mainwindow.Focus(); 
      return Result.Succeeded; 
     } 
     else 
     { 
      mainwindow = new MainWindow(commandData); 
      mainwindow.Show(); 
      return Result.Succeeded; 
     } 
    } 
} 

私は自分の外部アプリケーションを呼び出すときにこのコードが実行されるが、目標は、同時に開くために、複数のMainWindowを避けるためです。

私が窓を閉じると、私はもう窓を開けることができません。ウィンドウを閉じてもnullにならないということですか? Closingイベントを無効にする必要がありますか、別の方法がありますか?

+0

なぜウィンドウを閉じてもあなたが持っている参照? 'Ref Window 'を' Close'メソッドに渡しているわけではありませんので、起こることはありません。 – Joey

答えて

0

私はこのような場合にマネージャークラスを使用しています。登録されているすべてのウィンドウタイプを追跡し、Closedイベントにサブスクライブします。

public class SingleWindowTypeHelper 
{ 
    public SingleWindowTypeHelper() 
    { 
     _windows = new List<Window>(); 
    } 

    private readonly List<Window> _windows; 

    public T GetExistingWindow<T>() 
    { 
     return _windows.OfType<T>().FirstOrDefault(); 
    } 

    public bool ShowExistingWindow<T>() where T : Window 
    { 
     T window = GetExistingWindow<T>(); 
     if (window == null) return false; 

     if (window.WindowState == WindowState.Minimized) 
      window.WindowState = WindowState.Normal; 

     window.Activate(); 
     return true; 
    } 

    public void AddNewWindow(Window window) 
    { 
     _windows.Add(window); 
     window.Closed += WindowOnClosed; 

     window.Show(); 
     window.Activate(); 
    } 

    private void WindowOnClosed(object sender, EventArgs eventArgs) 
    { 
     Window window = sender as Window; 
     if (window == null) return; 

     window.Closed -= WindowOnClosed; 
     _windows.Remove(window); 
    } 
} 

あなたは自分のコード

private readonly SingleWindowTypeHelper _windowHelper = new SingleWindowTypeHelper(); 

のどこかのインスタンスを必要とする、それを使用して、このような既存のウィンドウを確認するには:

if (_windowHelper.ShowExistingWindow<YourWindowType>()) return; 

YourWindowType dialog = new YourWindowType(); 
// do some additional initialization here 
_windowHelper.AddNewWindow(dialog); 

またはあなたの場合:

public class StartRIR : IExternalCommand 
{ 
    private static readonly SingleWindowTypeHelper _windowHelper = 
     new SingleWindowTypeHelper(); 

    public Result Execute(
     ExternalCommandData commandData, 
     ref string message, 
     ElementSet elements) 
    { 
     if (_windowHelper.ShowExistingWindow<MainWindow>()) 
      return Result.Succeeded; 

     MainWindow dialog = new MainWindow(commandData)(); 
     _windowHelper.AddNewWindow(dialog); 
     return Result.Succeeded; 
    } 
} 
+0

これは私が尋ねる問題ではうまくいきますが、今度は同じウィンドウを何回か開くことができます:/ – Babuh

+0

申し訳ありませんが、私はあまり理解していません。これがうまくいけば(私はそれをしていると確信しています、私もそれを使用しています) - なぜあなたは何度かウィンドウを開くことができますか? –

+0

私の 'MainWindow'は、一度に1回開く必要があります。私はそれを2度目に呼び出すと、それをアクティブにするべきですが、新しいものを作成しないようにしてください – Babuh

1

wpfウィンドウを閉じると、デフォルトで再び開くことはできません。これを丸めるには、OnClosingメソッドをオーバーライドして、ウィンドウの可視性を非表示に設定し、closeイベントをキャンセルする必要があります。

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    this.Visibility = Visibility.Hidden; 
    e.Cancel = true; 
} 

一度に開いているあなたの窓のserveralのバージョンを停止する場合は、あなたがにShowDialogを(使用して検討することもでき)の代わりにショーの()。これは、ウィンドウが閉じられるまでバックグラウンドアプリケーションをロックアウトします。フォームのまったく同じインスタンスを再利用する場合は、OnClosingメソッドをオーバーライドする必要があります。

関連する問題