从窗口返回值到WPF类

3
在我的类中的一个方法中,我调用了Login.Show(),它是一个登录窗口。当单击登录按钮时,我希望窗口能将电子邮件地址传回给该类,而不创建一个新的类实例。是否有任何方法可以实现这一点?
目前,我的代码如下:
Login loginWindow;
public void AppStartup {
    loginWindow = new Login();
    loginWindow.Show();
    //in this instance I'd like the email to be returned here

Login.xaml.cs 文件中

public void Login_Click(object sender, RoutedEventArgs e)
{
    string email;
    try {
        email = InputEmail.Text;
        //ideally I would like to return email to AppStartup without
        //using new AppStartup(); , rather back in the same instance
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message); 
    }
}

2
我会深入了解WPF中的MVVM绑定(binding) - jazb
只需在LoginWindow类中添加一个公共属性,并在Login_Click处理程序中设置它。 - Jon
你知道吗,从WPF(甚至WinForms)应用程序中使用Console.WriteLine(ex.Message);方法是有技巧的吗? - vasily.sib
你可能想要使用ShowDialog()而不是Show()。这样,在调用之后,你就可以访问@Jon建议的成员变量了。 - Klaus Gütter
1个回答

7

您可以调用 ShowDialog() 而不是 Show() 来显示窗口,然后直接访问 InputEmail 控件的 Text 属性:

loginWindow = new Login();
loginWindow.ShowDialog();
string email = loginWindow.InputEmail.Text;

Show() 不同的是,ShowDialog() 在窗口关闭之前不会返回。

或者你可以在 Login 窗口或其 DataContext 中添加一个属性,并在单击按钮时设置此属性。

public string Email { get; set; }

public void Login_Click(object sender, RoutedEventArgs e)
{
    Email = InputEmail.Text;
}

string email = loginWindow.Email;

我尝试过了,但似乎不起作用,它不等待Login_Click事件,所以'email'的值始终为空。我需要使用while循环来等待Login点击事件被触发吗? - Explorex
你需要调用ShowDialog()而不是Show()。你真的试过这个吗? - mm8
是的,但它通过showdialog和email = window.email立即运行,因此从未给其更新的机会,就像等待登录点击发生一样。我几乎需要它像await login click一样。这有意义吗? - Explorex
不,ShowDialogloginWindow 关闭之前不会返回。而且在窗口关闭后,你无法点击按钮。 - mm8
哦...窗口需要关闭才能将结果传回吗?如果是登录窗口,如果他们输入的详细信息不正确,我不希望它关闭。 - Explorex
1
它需要在调用 ShowDialog 的方法之前关闭...如果您不希望这样,可以从登录窗口引发事件,并在您的应用程序类中处理。 - mm8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接