web-dev-qa-db-ja.com

`MainWindow`(C#)を含むWPFウィンドウ間でデータを渡すにはどうすればよいですか?

私は現在、単純な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に入れたメソッドにアクセスするにはどうすればよいですか?
  • 別のWPFウィンドウを作成し、そのプロパティに簡単にアクセスできるように、それが私の "プライマリスクリーン"のふりをする方がよいですか。
  • そうでない場合、MainWindowを使用するより良い方法はありますか?

何か足りない場合はお知らせください。ありがとう!

8
Kendall

ウィンドウ間で参照を渡さなくても、実際にアプリケーションのメインウィンドウにアクセスできます。 Application.Current.MainWindowは、app.xamlで宣言されているメインウィンドウのインスタンスを返します。これはWindow(メインウィンドウの派生元)を返すため、そのメンバーにアクセスするにはキャストする必要があります。

たとえば、2番目のウィンドウで次のコードを使用できます。

((MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";

そうは言っても、WPFのデザインパターン(特に [〜#〜] mvvm [〜#〜] )を調査することをお勧めします。

11
learningcs

最初のウィンドウを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セットを設定することをお勧めします。このようにして、プロパティを両方のウィンドウに直接バインドし、手動で更新する必要がないようにすることもできます。

1
eran otzap

ウィンドウ全体を通過
これはMainWindowになります

Window2 newWindow = new Window2(this);
0
paparazzo