私は現在、単純なATMマシンをモデル化するC#プロジェクトを開始しているため、いくつかの画面が必要になります。 StockTickerボードゲームの適応をコーディングする前に、画面間でデータを渡す問題に遭遇しましたが、それを解決する私の方法は非常に良かったとは思いません。
私の問題の多くは、アプリケーションのプライマリウィンドウとしてMainWindow
を使用していることが原因です。 Window1
クラスが閉じられた後、そのプロパティにアクセスできるので、セカンダリウィンドウからプライマリウィンドウにデータを簡単に渡すことができます。ただし、MainWindow
からWindow2
に転送するには、必要な値を渡せるようにするパラメーターをWindow2
のコンストラクターに追加する必要があります。
これは小さなアプリケーションでは機能しますが、Window2
に渡す必要があるより多くのものに対してこれは非常に長く/面倒になるだろうと私は考えています。さらに、Window2
からMainWindow
で宣言したメソッドにアクセスする方法がまったくわかりません。 MainWindow
がプライマリスクリーンであるため、私のコーディングのほとんどはそのクラスにあります。
Window2
からMainWindow
に入れたメソッドにアクセスするにはどうすればよいですか?(明確化のため)しばらく時間をかけて調べましたが、MainWindow
を具体的に含み、そこにある変数/メソッドにアクセスする必要がある明確な例を見つけることができません。
この例では、フォームからフォームにデータを転送する方法を見つけたことを示しているだけですが、もっと良い方法があると確信しています。具体的には、Window2
クラスのさまざまなパラメーターを使用して、さまざまなコンストラクターをコーディングするよりも優れた方法があると確信しています。
namespace Banking_System
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnSwitchForm_Click(object sender, RoutedEventArgs e)
{
string strForm1Text = txtForm1TextBox.Text;
Window2 newWindow = new Window2(strForm1Text);
newWindow.ShowDialog();
txtForm2TextBox.Text = newWindow.strForm2Text;
}
}
}
2番目のWPFウィンドウコード:
namespace Banking_System
{
public partial class Window2 : Window
{
public string strForm2Text { get; set; }
public Window2(string form1)
{
InitializeComponent();
txtForm1.Text = form1;
}
private void btnSwitchBack_Click(object sender, RoutedEventArgs e)
{
strForm2Text = txtForm2TextBox.Text;
this.Close();
}
}
}
別のWPFウィンドウを作成し、MainWindow
がロードされたらすぐにロードし、MainWindow
を非表示にして、他のウィンドウがプライマリ画面であるように見せかけるほうがよいでしょうか?そのため、上記と同じ方法でプロパティにアクセスできます(Window2
からMainWindow
に転送するとき)。
すなわち。別のウィンドウから変数/メソッドにアクセスする必要がある場合は、新しい一時ウィンドウを宣言して、そのプロパティ/メソッドにアクセスするだけです。
FakeMainWindow wndPrimary = new FakeMainWindow();
wndPrimary.strProperty= "test";
wndPrimary.methodCall();
この方法の主な魅力は、別のウィンドウのメソッドにアクセスできることです(上記の図を参照)。これは、MainWindow
をプライマリフォームとして使用しているときにはできません。
概要
Window2
からMainWindow
に入れたメソッドにアクセスするにはどうすればよいですか?MainWindow
を使用するより良い方法はありますか?何か足りない場合はお知らせください。ありがとう!
ウィンドウ間で参照を渡さなくても、実際にアプリケーションのメインウィンドウにアクセスできます。 Application.Current.MainWindow
は、app.xamlで宣言されているメインウィンドウのインスタンスを返します。これはWindow
(メインウィンドウの派生元)を返すため、そのメンバーにアクセスするにはキャストする必要があります。
たとえば、2番目のウィンドウで次のコードを使用できます。
((MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";
そうは言っても、WPFのデザインパターン(特に [〜#〜] mvvm [〜#〜] )を調査することをお勧めします。
最初のウィンドウを2番目のウィンドウのDataContextとして設定できます。
namespace Banking_System
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnSwitchForm_Click(object sender, RoutedEventArgs e)
{
Window2 newWindow = new Window2(strForm1Text);
newWindow.DataContext = this;
newWindow.ShowDialog();
}
}
public partial class MainWindow2 : Window
{
public MainWindow2()
{
var window1 = this.DataContext;
}
}
}
さらに、他のウィンドウに送信できるDataContextであるため、ウィンドウには独自のViewModelセットを設定することをお勧めします。このようにして、プロパティを両方のウィンドウに直接バインドし、手動で更新する必要がないようにすることもできます。
ウィンドウ全体を通過
これはMainWindowになります
Window2 newWindow = new Window2(this);