プログラムの設計を再構築する必要があります。あなたがやりたいことはそれほど難しいことではありません。あなたは本質的に、フォーム間で通信するための良い方法を求めています。
まず、Application.Current.MainWindow
本当に必要かどうか確信が持てない限り、使用しないことをお勧めします。それを使ってアプリを動作させることはできますが、それは良いデザインではなく、問題を引き起こします。
OtherWindow
ポップアップとなるいくつかの定義から始めましょう。
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for OtherWindow.xaml
/// </summary>
public partial class OtherWindow : Window
{
public OtherWindow()
{
InitializeComponent();
}
public string SomeData
{
get
{
//you'll probably want to return the value of a textbox or something else
//the user fills in.
return "Hello World!";
}
}
}
}
コミュニケーションの観点から、本当に重要なのは、メインフォームがアクセスする必要のある情報を含む1つまたは複数のプロパティを持っていることです。明らかに、返すデータを実際に収集するためのすべてのコードを省略し、代わりにこの例の値をハードコーディングしました。
今度はメインフォームです。(追加したのはボタンとラベルだけです。)
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
OtherWindow other = new OtherWindow();
other.Closed += (sender2, e2) =>
{
label1.Content = other.SomeData;
};
//either of the methods below, depending on desired behavior.
other.Show();
//other.ShowDialog();
}
}
}
さまざまなウィンドウ/フォームを通信させる方法はたくさんありますが、これは私のお気に入りです。ウィンドウ間の相互作用のすべてのロジックが1か所にまとめられています(ボタンクリックイベント)。メインフォームは明らかに「所有」しておりOtherWindow
、情報を知る必要はありOtheWindow
ませんMainWindow
。情報を収集する方法を知っているだけで済みます。 MainWindow
必要な情報の引き出しを担当します。
ボタンクリックのコードは、あなたがやりたいことと同じように読めます。新しいウィンドウを作成し、閉じたときにそのコンテンツを私のラベルに設定して、フォームを表示します。それはすべて1つの場所にあり、論理的に考えた順序で行われます(必要に応じて、後でイベントハンドラーをアタッチできShow
ます)。
ああ、これは私がwinformsアプリでもこれを行うのとまったく同じ方法です。誰かが気にかけている場合は、クラス/プロパティ名の一部が異なるという事実を除けば。