繁体   English   中英

我应该如何在涉及“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的更多内容来说会变得很长/很混乱。 此外,我根本不知道如何从Window2访问我在MainWindow上声明的任何方法。 由于MainWindow是主屏幕,我的大部分编码都在它的 class 中。

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

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


这是我的 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并“假装”另一个 window 是主屏幕? 因为那时我可以简单地以与上面相同的方式访问属性(从Window2传输到MainWindow时)。

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

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

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

概括

  • 如何访问我从Window2放入MainWindow的方法?
  • 创建另一个 WPF window 并假装它是我的“主屏幕”以便我可以轻松访问它的属性会更好吗?
  • 如果没有,是否有更好的方法来使用MainWindow

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

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

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

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

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

通过整个窗口
这将是主窗口

Window2 newWindow = new Window2(this);

您可以将第一个窗口设置为第二个窗口的 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。 通过这种方式,您还可以将属性直接绑定到两个窗口,而不必担心手动更新它们。

create a static class & put static methods & or static properties that are common to all windows.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM