【问题标题】:How to close a startup window如何关闭启动窗口
【发布时间】:2015-03-29 17:28:39
【问题描述】:

我有一个作为启动 URI 的登录窗口的 C# WPF 应用程序。我想关闭启动窗口,即用户名和密码组合正确时的登录窗口。

我有这个代码

var username = query.username;
var password = query.password;

if (userTexbox.Text == username.ToString() && passwordbox.Password == password.ToString())
{
    var entity = new Log
    {
        user = userTexbox.Text,
        dateTime = DateTime.Now.ToString()
    };
    logCollection.Insert(entity);

    Mainwindow main = new MainWindow();
    this.Close();
}
else
{
    MessageBox.Show("User not found/Wrong credentials", "Re-enter Credentials");
}

但即使使用 Close() 方法,登录窗口仍然可见,虽然不活动。

【问题讨论】:

  • 您的窗口没有关闭的唯一原因可能是您的 Mainwindow 构造函数或 logCollection.Insert 中的某些操作被阻塞,因此您的代码实际上永远不会到达 this.Close(),如果您放置断点在关闭行上,您会注意到它从未到达。

标签: c# wpf


【解决方案1】:

改变逻辑:将主窗口设置为启动窗口,然后从主窗口显示登录窗口。检查下面的代码,它是主窗口的构造函数:

...
public MainWindow()
{
    InitializeComponent();

    //--init main windows minimized
    WindowState = System.Windows.WindowState.Minimized;

    Loaded +=
        delegate
        {
            //hide main window
            Hide();

            //initialize the login window
            var loginWin = new LoginWindow
            {
                WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen,
                WindowStyle = System.Windows.WindowStyle.SingleBorderWindow,
            };

            loginWin.Closed += delegate
            {
                //check login result (OK)
                if (loginWin.Result != LoginResult.Success)
                    Application.Current.Shutdown(1);

                //--display the main window
                Show();
                WindowState = System.Windows.WindowState.Normal;
                Focus();
            };

            //show&focus the login
            loginWin.Show();
            loginWin.Focus();
        };
}
...

希望对你有帮助。

编辑

这里是LoginWindow 代码。

public partial class LoginWindow : Window
{
    public LoginResult Result { get; private set; }

    public LoginWindow()
    {
        InitializeComponent();
    }

    private void ButtonLogin_OnClick(object sender, RoutedEventArgs e)
    {
        //example login button
        Result = DoLogin();
        Close();
    }

    private LoginResult DoLogin()
    {
        //NOTE: Add your login logic here (for now sucess response)
        return LoginResult.Success;
    }
}

public enum LoginResult
{
    Unknow,
    Success,
    Failed
}

【讨论】:

  • 我不确定 loginWin.Result 试图暗示什么,它是来自 loginWindow 的变量吗?
  • @fredpedro loginWin.Result 将存储登录结果,例如:它可以是像public enum LoginResult { Unknown, Failed, Success} 这样的枚举。我希望它有所帮助。如果您需要更多帮助,请告诉我。
【解决方案2】:

这里缺少的是 MainWindow 的赋值

Application.Current.MainWindow = main;

在创建 MainWindow 的新实例后,如果您为其分配 Application.Current.MainWindow(在关闭登录窗口之前),那么它有一个主窗口来继续 STA 线程,并且可以释放 LoginWindow 线程。

如果这有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多