我应该如何在涉及 `MainWindow` (C#) 的 WPF Windows 之间传递数据?

How should I pass data between WPF Windows involving `MainWindow` (C#)?

我目前正在启动一个 C# 项目,在该项目中我正在为一台简单的 ATM 机建模,因此需要多个屏幕。之前在编写 StockTicker 棋盘游戏改编代码时,我曾 运行 遇到过屏幕之间传递数据的问题,但我认为我的解决方法不是很好。

我的很多问题都源于我使用 MainWindow 作为应用程序的主要 window。我能够轻松地将数据从辅助 window 传回主 window,因为我能够在关闭后访问 Window1 class 的属性.但是,要从 MainWindow 转移到 Window2,我必须向 Window2 的构造函数添加一个参数,这将使我能够传递必要的值。

虽然这确实适用于小型应用程序,但我认为对于需要传递给 Window2 的更多内容,这会变得非常 long/messy。此外,我完全不知道如何从 Window2 访问我在 MainWindow 上声明的任何方法。由于 MainWindow 是主屏幕,我的大部分代码都在 class 中。

(为了澄清)我花了一些时间环顾四周,找不到一个明确的例子,具体涉及 MainWindow,并且需要访问其中找到的 variables/methods。


这是我的 C# 代码(我尝试使用清晰的变量名称)。该程序的要点是您可以将一些数据存储在 Form 1 上,然后在单击按钮时将其传递给 Form 2。从这里,可以根据用户的意愿对其进行修改,然后在关闭 Form 2 时可以从 Form 1 再次访问它。

在这个例子中,我只是展示我找到了一种将数据从一个表单传输到另一个表单的方法,但我确信还有更好的方法。具体来说,我确信有一种更好的方法,而不是必须为 Window2 class 编写具有不同参数的不同构造函数。


第一个 WPF Window 代码:

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;
        }
    }
}

第二个 WPF Window 代码:

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 window,并在 MainWindow 加载后立即加载它,然后隐藏 MainWindow 和 "pretend"另一个 window 是主屏幕?因为这样我就可以像上面那样简单地访问属性(从 Window2 转移到 MainWindow 时)。

即。当需要从另一个 window 访问一个 variable/method 时,只需声明一个新的临时 window 并访问它的 properties/methods:

FakeMainWindow wndPrimary = new FakeMainWindow();
wndPrimary.strProperty= "test";
wndPrimary.methodCall();

这种方式对我的主要吸引力在于我可以访问另一个 window 上的方法(如上图所示),这是我在使用 MainWindow 作为我的主要形式时无法做到的。

总结

如果我遗漏了什么,请告诉我。谢谢!

全部通过window
这将是 MainWindow

Window2 newWindow = new Window2(this);

您可以将第一个 window 设置为第二个 window 的 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;
      }
 }  

}

此外,我建议您的 Window 设置自己的 ViewModel,因为它是 DataContext,您可以将其发送给另一个 window。 通过这种方式,您还可以将属性直接绑定到 windows,而不用担心手动更新它们。

您实际上可以访问应用程序的主 window 而无需在 windows 之间传递任何引用。 Application.Current.MainWindow returns 在 app.xaml 中声明的主要 window 的实例。它 returns 一个 Window (你的主要 window 派生自)所以你需要转换它才能访问它的成员。

例如,您可以在第二个 window:

中使用此代码
((MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";

话虽如此,我还是建议您对 WPF 设计模式进行一些研究(特别是 MVVM)。