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

时间:2015-05-05 21:30:15

标签: c# wpf window

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

我的很多问题源于我使用use Exception; // ... catch (\Exception $e) { // ... } 作为应用程序的主窗口这一事实。我能够轻松地将数据从辅助窗口传递回主窗口,因为我可以在关闭后访问MainWindow类的属性。但是,要从Window1转移到MainWindow,我必须向Window2的构造函数添加一个参数,以便我传递必要的值。

虽然这适用于小型应用程序,但我认为,对于需要传递给Window2的更多内容,这会变得非常冗长/混乱。另外,我根本不知道如何从Window2访问我在MainWindow上声明的任何方法。由于Window2是主屏幕,因此我的大多数编码都在同类中。

  • 如何从MainWindow ??
访问我放入MainWindow的方法

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

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

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

<小时/> 第一个WPF窗口代码:

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

我最好创建另一个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(); } } } 加载后立即加载,然后隐藏MainWindow和&#34;假装&#34;另一个窗口是主屏幕?因为那时我可以像上面那样(从MainWindow转移到Window2时)访问属性。

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

MainWindow

这种方式的主要吸引力在于我可以访问另一个窗口上的方法(如上图所示),这是我使用FakeMainWindow wndPrimary = new FakeMainWindow(); wndPrimary.strProperty= "test"; wndPrimary.methodCall(); 作为主要表单时无法做到的。

摘要

  • 如何从MainWindow访问MainWindow中放入的方法?
  • 最好是创建另一个WPF窗口,并假装它是我的&#34;主屏幕&#34;这样我就可以轻松访问其属性了吗?
  • 如果没有,是否有更好的方式使用Window2

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

3 个答案:

答案 0 :(得分:10)

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

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

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

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

答案 1 :(得分:1)

通过整个窗口
这将是MainWindow

Window2 newWindow = new Window2(this);

答案 2 :(得分:1)

您可以将First窗口设置为Second窗口的DataContext:

    int main(void)
    {
       char c;
       int i = 0;
       int maxLines = 18;
       char lines[maxLines][BUFSIZ];
       FILE *fp = fopen("inputs/control.txt", "r");

       if (fp == 0)
       {
           fprintf(stderr, "failed to open inputs/control.txt\n");
           exit(1);
       }

       char buffer[maxLines];
       while (i < maxLines && fgets(buffer[i], sizeof(buffer[0]), fp))
       {
          sscanf (buffer, "%d %d %d", &lines[i][0], &lines[i][1], &lines[i][2]);    
          i++;
       }

       fclose(fp);
       return 0;
    }

}

此外,我建议您的Window将其自己的ViewModel设置为您可以发送到其他窗口的DataContext。 通过这种方式,您还可以将属性直接绑定到两个窗口,而不必担心手动更新它们。