【问题标题】:The best approach to show/hide windows indpendently独立显示/隐藏窗口的最佳方法
【发布时间】:2012-07-30 02:35:34
【问题描述】:

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

  1. 登录窗口

  2. 创建帐户窗口

  3. 和主应用程序窗口。

我上传了一个图来显示我正在尝试实现的导航类型:

我认为在另一个窗口的关闭/加载事件中显示/隐藏一个窗口是不正确的。

  1. 谁能告诉我实现此导航的正确方法?

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

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

如果这很明显或很容易做到,我很抱歉。 谢谢

【问题讨论】:

  • 这个问题还不错,但在stackoverflow这样的平台上很难,所以恐怕你不会得到一个合适的答案。至少只是一些想法:为什么窗口必须是应用程序类的属性?如果它们是模态对话框,则应就地创建它们,然后直接销毁它们(当然主窗口除外)。不,关闭并加载可能不是最好的主意,因为尚未显示所有者窗口。只需在您需要的位置创建对话框并将当前模式窗口设置为所有者。

标签: wpf navigation


【解决方案1】:

我不会将三个窗口作为应用程序的属性。我会实例化登录窗口的副本并将其用作我的中心控制点。

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

例如

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

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

例如:

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

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

希望对您有所帮助...

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      如果我的回复解决了你的问题,别忘了把我的回复标记为答案。

      【讨论】:

        【解决方案4】:

        我建议你遵循这个模式。您的逻辑看起来与 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-21
          • 1970-01-01
          相关资源
          最近更新 更多