2011-07-12 13 views
3

私のウィンドウクラスには、このようなイベントハンドラが必要です。WPF兄弟ウィンドウを作成して現在のウィンドウを閉じる

void someEventHandler(object sender, RoutedEventArgs e) 
{ 
    MyNewWindow mnw = new MyNewWindow(); 
    mnw.Owner = Window.GetWindow(this); 
    mnw.ShowDialog(); 
    this.Close(); 
} 

Window.GetWindow(this)は、現在のウィンドウの親ウィンドウを返します。

私は新しいウィンドウの所有者が現在のウィンドウの親ウィンドウであると思っていましたが、親を待つことになりました。現在のものではありません。しかし、それはそのようには機能しませんでした。現在のウィンドウは新しいウィンドウの実行を待機し、その後にのみ閉じます。

何らかの理由でShowDialog()の代わりにShow()を使用すると、そのウィンドウはまったく表示されません。

おそらく私はいくつかのデリゲートメソッドが必要ですが、どこから始めたらよいか分かりません。

編集:将来の参照のために質問を改善する必要があると思います。 新しいウィンドウは、親ウィンドウへのダイアログでなければなりません。私がShow()を使うと、親ウィンドウがアクセシブルになり、私はそれを望んでいません。 ShowDialog()を使用すると、現在のウィンドウへのダイアログになります。つまり、新しいウィンドウが閉じられるまで現在のウィンドウが閉じず、そのどちらも必要ありません。

答えて

5

ウィンドウを閉じると、所有するウィンドウがすべてto be closedになります。

オーナーウィンドウを表示したくない場合は、これを試してください。

void someEventHandler(object sender, RoutedEventArgs e) 
{ 
    MyNewWindow mnw = new MyNewWindow(); 
    mnw.Owner = this; 
    this.Hide(); // not required if using the child events below 
    mnw.ShowDialog(); 
} 

あなたはおそらく、あなたの要件に応じて、子ウィンドウを閉じると、それに応じて動作親ウィンドウにいくつかのイベントをフックアップしたいと思います。あなたはおそらく子供から(複数の親)の隠ぺいを制御することができ

EDIT

void OnLoad(object sender, RoutedEventArgs e) 
{ 
    this.Owner.Hide(); 
} 
void Closed(object sender, RoutedEventArgs e) 
{ 
    this.Owner.Show(); 
} 
+0

これを親ウィンドウで処理するのが最も簡単な方法です。子ウィンドウは他のさまざまなウィンドウから呼び出すことができ、複雑になります。私は親ウィンドウのそれぞれでイベントハンドラを変更する必要があり、私はそれを望んでいません。 – Kta

+0

btw。 ShowDialog()の前にthis.Hide()を呼び出すことで解決策が保証されました。ウィンドウは閉じられていませんが、少なくともユーザーはそう考えています:) ty – Kta

1

私はあなたが何をしようとして理解していれば、あなたが現在のウィンドウを閉じ、元のウィンドウの親(おそらく、アプリのメインウィンドウ)であったウィンドウの子であるMyNewWindowとそれを交換したいです。

mnw.Owner = this.Owner; 

の代わりに、あなたの現在のウィンドウのインスタンスをバック与えは、GetWindowを呼び出すを:あなたが使用してする必要があることを行うには

。 GetWindowの目的は、他のUIElementを含むWindowを取得することです(Treeの下にあるButtonのように)。 Windowインスタンスを渡すときに渡したものを返すだけです。

+0

あなたは私を正しくしました。しかし、私は新しいウィンドウをメインウィンドウへのダイアログとして表示したい。 Show()もShowDialog()もこの方法を提供しませんでした。 – Kta

1

ShowDialog()ブロックを呼び出します。つまり、このメソッドは、mnwが閉じているときにのみ戻り、その後は元のウィンドウが閉じていることを意味します。

Show()に変更すると、元のウィンドウでClose()と呼ぶとすぐにmnwが閉じます。 Window.GetWindow(this)thisを返すためです。したがって、オーナーをthisに設定し、thisを閉じると、mnwも閉じます。それで私たちは次のようになります:

MyNewWindow mnw = new MyNewWindow(); 
mnw.Owner = this.Owner; // may not be necessary 
mnw.Show(); 
this.Close(); 

このコードは私にとってはうまくいくようです。

+0

私がShow()を呼び出すと、親ウィンドウがアクセス可能になります。新しいウィンドウを親ウィンドウのダイアログにしたい。 – Kta

関連する問題