我目前正在开始一个C#项目,我正在为一台简单的ATM机建模,因此需要几个屏幕。在我编写StockTicker棋盘游戏改编编码之前,我遇到了在屏幕之间传递数据的问题,但我不认为我的解决方法非常好。
我的很多问题源于我使用use Exception;
// ...
catch (\Exception $e) {
// ...
}
作为应用程序的主窗口这一事实。我能够轻松地将数据从辅助窗口传递回主窗口,因为我可以在关闭后访问MainWindow
类的属性。但是,要从Window1
转移到MainWindow
,我必须向Window2
的构造函数添加一个参数,以便我传递必要的值。
虽然这适用于小型应用程序,但我认为,对于需要传递给Window2
的更多内容,这会变得非常冗长/混乱。另外,我根本不知道如何从Window2
访问我在MainWindow
上声明的任何方法。由于Window2
是主屏幕,因此我的大多数编码都在同类中。
MainWindow
?? MainWindow
的方法
(为了澄清)我花了一些时间环顾四周,找不到明确涉及Window2
的例子,并且需要访问其中的变量/方法。
在这个例子中,我只是表明我已经找到了一种从表单到表单传输数据的方法,但我确信有更好的方法。具体来说,我确信有一种更好的方法,而不是可能为MainWindow
类编码具有不同参数的不同构造函数。
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
和"假装"另一个窗口是主屏幕?因为那时我可以像上面那样(从MainWindow
转移到Window2
时)访问属性。
即。当需要从另一个窗口访问变量/方法时,只需声明一个新的临时窗口并访问它的属性/方法:
MainWindow
这种方式的主要吸引力在于我可以访问另一个窗口上的方法(如上图所示),这是我使用FakeMainWindow wndPrimary = new FakeMainWindow();
wndPrimary.strProperty= "test";
wndPrimary.methodCall();
作为主要表单时无法做到的。
摘要
MainWindow
访问MainWindow
中放入的方法?Window2
?如果我遗漏了什么,请告诉我。谢谢!
答案 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。 通过这种方式,您还可以将属性直接绑定到两个窗口,而不必担心手动更新它们。