[英]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
,需要访问其中找到的变量/方法。
在这个例子中,我只是表明我已经找到了一种在表单之间传输数据的方法,但我确信还有更好的方法。 具体来说,我确信有一种更好的方法,而不是为Window2
class 编写具有不同参数的不同构造函数。
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
的方法?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.