独立显示/隐藏窗口的最佳方法

时间:2012-08-01 08:11:57

标签: wpf navigation

我是一名学生,正在构建一个C#WPF应用程序。它有三个窗口:

  1. 登录窗口

  2. 创建帐户窗口

  3. 和主应用程序窗口。

  4. 我上传了一个图来显示我想要实现的导航类型:

    http://picturepush.com/public/8870554

    我认为在另一个窗口的close / load事件中显示/隐藏窗口是不正确的。

    1. 有人能告诉我实施此导航的正确方法吗?

    2. 此外,将三个窗口设为应用程序类的私有属性是一个好习惯吗?

    3. 最后一个窗口有一个框架控件来支持页面导航。再次,将MainWindow应用程序的三个页面私有属性更好吗?

    4. 如果这很明显或很容易,我很抱歉。 感谢

4 个答案:

答案 0 :(得分:0)

我不会将这三个窗口作为应用程序的属性。我会设置一个登录窗口的副本,并将其用作我的中心控制点。

当用户登录时,隐藏登录窗口,显示一个新的主窗口并在主窗口关闭事件上添加一个钩子。

e.g

if (logonSuccess)
{
    var mainWindow = new MainWindow();
    mainWindow.Closed += ReshowSignupWindow;
}

我还有登录窗口对创建帐户窗口执行相同操作。因此,我将创建帐户窗口返回到注册窗口,如果创建了帐户,该窗口将重新显示自身或启动主窗口。

e.g:

// In sign-in window, handle the create window being closed
private void CreateWindowClosedHandler(object sender, EventArgs e)
{
    if (accountCreatedOK)
    {
        ShowMainWindow();
    }
    else
    {
        ReshowSignupWindow();
    }
}

我可能会看到通过调用ShowDialog()将创建帐户窗口显示为对话框窗口。

希望有帮助...

答案 1 :(得分:0)

像这样的代码可能会这样做(未经测试,我只是在visual studio中输入以自动编码代码) XAML用于登录对话框。 RegistrationDialog应该类似,除了注册Button的按钮和处理程序。

<Window x:Class="WpfApplication1.LoginWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="LoginWindow">
    <StackPanel>
        <Button IsDefault="True" Content="Submit" Click="SubmitButton_Click"/>
        <Button IsCancel="True" Content="Cancel" />
        <Button Content="CreateAccount" Click="CreateAccountButton_Click"/>
    </StackPanel>
</Window>

//Handler of LoginWindow and RegistrationWindow
private void SubmitButton_Click(object sender, RoutedEventArgs e)
{
    this.DialogResult = true;
}

//Handler of LoginWindow only
private void CreateAccountButton_Click(object sender, RoutedEventArgs e)
{
    this.IsCreatingAccount = true;
    this.DialogResult = false;
}

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        bool isCanceled;

        while (loginWin.ShowDialog() == false && !isCanceled)
        {
            if (loginWin.IsAccountCreationRequested)
            {
                if (registrationWin.ShowDialog())
                {
                    isCanceled = true;
                }
                else
                {
                    loginWin.IsAccountCreationRequested = false;
                }
            }
            else
            {
                isCanceled = true;
            }
        }

        if (loginWin.DialogResult) MainWindow.Show();
    }
}

答案 2 :(得分:0)

我目前正在开发一个与您的应用程序或多或少类似的Silverlight应用程序。我觉得你可以有2个xaml控件(一个用于登录,另一个用于你的主应用程序)。对于create account,您可以使用将从登录控件调用的子窗口。并在主应用程序中使用TabControl,它将保存其他3个xaml控件(Page1.xaml,Page2.xaml和Page3.xaml)。如果您有任何问题,请随时询问。

如果它能解决您的问题,请不要忘记将我的回复标记为答案。

答案 3 :(得分:0)

我建议你遵循这个模式。您的逻辑看起来与UI(用户界面)和逻辑紧密绑定。

我喜欢的最佳模式是WPF或Silverlight是MVVM(模型视图模型)。在谷歌MVVM中有很多可用的例子。

只需看一眼任何MVVM示例,您就可以清楚地开发WPF或Silverlight应用程序了。

下面是一些链接, http://msdn.microsoft.com/en-us/magazine/dd419663.aspx http://www.c-sharpcorner.com/UploadFile/raj1979/simple-mvvm-pattern-in-wpf/ http://www.codeproject.com/Articles/126249/MVVM-Pattern-in-WPF-A-Simple-Tutorial-for-Absolute