【问题标题】:Returning Value From Window To Class WPF将值从窗口返回到 WPF 类
【发布时间】:2018-11-20 02:04:34
【问题描述】:

在我班级的一个方法中,我调用Login.Show(),它是一个Login Window。我希望窗口在单击登录按钮时将电子邮件传递回类,而不创建类的新实例。

有什么办法吗?

目前我有

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); 
    }
}

【问题讨论】:

  • 我会阅读 mvvmbinding 的 wpf
  • 只需在 LoginWindow 类中添加一个公共属性并在 Login_Click 处理程序中设置它
  • 您知道,在 WPF(甚至 WinForms)应用程序中使用 Console.WriteLine(ex.Message); 方法很棘手?
  • 您可能希望使用ShowDialog() 而不是Show()。然后就可以在调用后访问成员变量@JonSuggest。

标签: c# wpf return-value


【解决方案1】:

你可以调用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 所以'电子邮件'值总是什么都没有。我是否需要使用 while 循环并等待触发登录点击?
  • 您需要调用ShowDialog() 而不是Show()。你真的试过这个吗?
  • 是的,但是它会立即通过 showdialog 和 email =window.email 运行,因此它永远不会有更新的机会,就像等待登录点击发生一样。我几乎需要它就像等待登录点击一样?这有意义吗?
  • 不,ShowDialogloginWindow 关闭之前不会返回。而且你不能在窗口关闭后点击按钮...
  • 它需要在调用 ShowDialog 的方法继续到下一行之前关闭...如果您不希望这样做,您可以从登录窗口引发一个事件并在您的应用程序类中处理它。
猜你喜欢
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多