【问题标题】:How should I pass data between WPF Windows involving `MainWindow` (C#)?我应该如何在涉及`MainWindow`(C#)的WPF Windows之间传递数据?
【发布时间】:2015-07-15 19:28:33
【问题描述】:

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

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

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

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

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


这是我的 C# 代码(我尝试使用清晰的变量名)。该程序的要点是您可以将一些数据存储在 Form 1 上,然后在单击按钮时将其传递给 Form 2。从这里,它可以根据用户的意愿进行修改,然后当 Form 2 关闭时,可以从 Form 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;
        }
    }
}

第二个 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

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

【问题讨论】:

  • MvvmLight 消息,Prism 事件聚合器,为胜利解耦消息

标签: c# wpf window


【解决方案1】:

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

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

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

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

【讨论】:

  • 事后 5 年...由于提示研究 MVVM 和相关设计模式,我将其标记为已接受的答案
【解决方案2】:

传递整个窗口
这将是主窗口

Window2 newWindow = new Window2(this);

【讨论】:

  • 谢谢,它确实有效。这是推荐/安全的方法吗?看起来很简单,但我之前在任何地方都没有找到。
  • 如果它有效且不安全,请与 Microsoft 合作。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    相关资源
    最近更新 更多