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

Ken*_*all 8 c# wpf window

我目前正在开始一个C#项目,我正在为一台简单的ATM机建模,因此需要几个屏幕.在编写StockTicker棋盘游戏改编之前,我遇到了在屏幕之间传递数据的问题,但我不认为我的解决方法非常好.

我的很多问题源于我MainWindow用作应用程序的主窗口这一事实.我能够轻松地将数据从辅助窗口传递回主窗口,因为我可以Window1在关闭后访问类的属性.但是,为了转移MainWindowWindow2,我必须在构造函数中添加一个参数,Window2这将使我能够传递必要的值.

虽然这适用于小型应用程序,但我认为,对于需要传递的更多内容,这将变得非常冗长/混乱Window2.另外,我不知道一切是如何访问任意的,我申报的方法MainWindowWindow2.由于MainWindow是主屏幕,我的大多数编码都在同类中.

  • 我如何访问我已经把方法MainWindowWindow2

(为了澄清)我花了一些时间环顾四周,找不到明确的例子,特别涉及MainWindow,并需要访问其中的变量/方法.


这是我的C#代码(我试图有明确的变量名称).程序的要点是,您可以在表单1上存储一些数据,然后在单击按钮时将其传递给表单2.从这里开始,它可以根据用户的意愿进行修改,然后在表单2关闭时可以从表单1再次访问它.

在这个例子中,我只是表明我已经找到了一种从表单到表单传输数据的方法,但我确信有更好的方法.具体来说,我确信有一个更好的方法,而不是可能编码不同的构造函数与Window2类不同的参数.


第一个WPF窗口代码:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我是否会更好地创建另一个WPF窗口,并在加载后立即MainWindow加载,然后隐藏MainWindow并"假装"另一个窗口是主屏幕?因为那时我可以简单地以与上面相同的方式访问属性(从Window2转移时MainWindow).

即.当需要从另一个窗口访问变量/方法时,只需声明一个新的临时窗口并访问它的属性/方法:

FakeMainWindow wndPrimary = new FakeMainWindow();
wndPrimary.strProperty= "test";
wndPrimary.methodCall();
Run Code Online (Sandbox Code Playgroud)

这种方式对我来说的主要吸引力在于我可以访问另一个窗口上的方法(如上图所示),这是我MainWindow用作主要表单时无法做到的.

摘要

  • 我如何访问我已经把方法MainWindowWindow2
  • 是否更好的创建另一个WPF窗口,并假装它是我的"主屏幕",以便我可以轻松访问其属性?
  • 如果没有,是否有更好的合作方式MainWindow

如果我遗失了什么,请告诉我.谢谢!

lea*_*gcs 11

您实际上可以访问应用程序的主窗口,而不会在窗口之间传递任何引用.Application.Current.MainWindow返回在app.xaml中声明的主窗口的实例.它返回一个Window(您的主窗口派生自的),因此您需要将其强制转换才能访问其成员.

例如,您可以在第二个窗口中使用此代码:

((MainWindow)Application.Current.MainWindow).txtForm1TextBox.Text = "Some text";
Run Code Online (Sandbox Code Playgroud)

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