繁体   English   中英

如何在C#WPF应用程序的Windows之间传递数据?

[英]How can I pass data between windows in my C# WPF application?

我的WPF应用程序的MainWindow中有一个登录表单。 如果用户成功登录,我想打开HomeWindow。 我的问题是我需要将adminID变量从MainWindow传递到HomeWindow。 我怎样才能做到这一点?

public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }

            private void btnLogin_Click(object sender, RoutedEventArgs e)
            {
                int errors = 0;
                if (txtUsername.Text == "")
                {
                    lblUsernameStatus.Content = "This field is required.";
                    errors = errors + 1;
                }

                if (txtPassword.Text == "")
                {
                    lblPasswordStatus.Content = "This field is required.";
                    errors = errors + 1;
                }

                if (errors == 0)
                {
                    Administrator TryLogin = new Administrator();
                    if (TryLogin.VerifyUser(txtUsername.Text, txtPassword.Text))
                    {
                        HomeWindow home = new HomeWindow();
                        int adminID = TryLogin.userID;
                        home.Show();
                        this.Close();
                    }
                    else
                    {
                        lblLoginStatus.Content = TryLogin.status;
                    }

                }
            }

PS:我没有在HomeWindow.xaml.cs文件中写任何东西。

HomeWindow定义一个初始化程序,以接受您希望发送的数据:

private int AdminID;

public HomeWindow()
{
    InitializeComponent();
}

public HomeWindow(int adminID) : base()
{
    AdminID = adminID;
}

然后,您可以:

HomeWindow home = new HomeWindow(TryLogin.userID);
home.Show();
this.Close();

声明静态变量将是最简单,最简单的方法,因为一旦登录授权,该值就不会更改,直到注销(退出应用程序)为止。

我还使用了一种通过Window构造函数传递值的方法,但是静态变量更容易利用已登录用户的许多固定数据,例如为每个用户定制的设置数据。 我也有一个WPF应用程序,并传递11个值,并且可以轻松地在应用程序中的任何地方使用。

在MainWindow中声明为静态变量,例如,

 public static int adminID;

 private void btnLogin_Click(object sender, RoutedEventArgs e)
{
    adminID= TryLogin.userID;
}

在HomeWindow中的用法就像

MainWindow.adminID

希望这可以帮助..

有多种方法可以实现此目的。

这是使用单例的示例

public class User
{
    private static readonly User _instance;
    private static object syncRoot = new Object();

    public string Id { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string SomeOtherProperty { get; set; }

    private User()
    { 
        // Initialize defaults
    }

    public void Reset()
    {
        // Clear existing values
    }

    public static User Instance
    {
        get 
        { 
            if (instance == null) 
            {
                lock (syncRoot) 
                {
                    if (_instance == null) 
                        _instance = new User();
                    return _instance; 
                }
            }
        }
    }   
}

在您的登录表单上:

private void btnLogin_Click(object sender, RoutedEventArgs e)
{
    int errors = 0;
    if (txtUsername.Text == "")
    {
        lblUsernameStatus.Content = "This field is required.";
        errors = errors + 1;
    }

    if (txtPassword.Text == "")
    {
        lblPasswordStatus.Content = "This field is required.";
        errors = errors + 1;
    }

    if (errors == 0)
    {
        Administrator TryLogin = new Administrator();
        if (TryLogin.VerifyUser(txtUsername.Text, txtPassword.Text))
        {
            User.Instance.Reset(); // Make sure old data is removed
            User.Instance.Username = txtUsername.Text;
            User.Instance.Password = txtPassword.Text;

            HomeWindow home = new HomeWindow();
            int adminID = TryLogin.userID;
            home.Show();
            this.Close();
        }
        else
        {
            lblLoginStatus.Content = TryLogin.status;
        }
    }
}

在您的家庭表格上:

您可以使用User.Instance检索用户凭据,只需确保在注销时将其重置即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM