WPF:在WPF中打开新窗口

时间:2015-04-19 12:09:29

标签: c# wpf visual-studio window

我想制作一个小程序我想用WP在WPF中打开一个新窗口。它是,但它就像mainWindow关闭,然后另一个窗口打开,我想,它会流畅"流畅",所以你认为它是一个窗口.. 这是我为它写的代码:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        Window1 w = new Window1();
        this.Hide();
        w.Show();
    }

你会怎么做?

2 个答案:

答案 0 :(得分:1)

我在WPF上没有太多经验。但是我之前见过的太多类似的案例,以及Windows Form&在这样的问题上,WPF没有太多差异。我在这里尝试回答,在我的电脑上进行测试,看看我给出的这些意见是否有帮助。

TL; DR :见最后一段。


将有3种方式(或更多?)来实现:

n个窗口,其中1是主窗口

就像您粘贴给我们的代码一样。 Hide()主窗口,Show()子窗口。

然而这确实是我建议您使用的最后一个选项,因为当您有许多窗口要关闭/ Hide()Show()时,它会变成。您将导致不知道您的打开窗口的堆栈如何。

1个主窗口+ n个用户控件

这需要在User Control中创建所有内容并实现行为。然后,主窗口将成为用户控件停靠在其中的容器UserControl.Dock = DockStyle.Fill

主窗口可能有一个停靠在顶部的菜单栏,它总是可以在不同的屏幕上看到'如果没有其他配置。

从UserControl更改窗口的对接UserControl:

C#Windows窗体

this.Parent.Controls.Add(new UserControl1()
{
    Dock = DockStyle.Fill
});
this.Parent.Controls.Remove(this);

WPF

主窗口应包含以示例mainDock命名的 DockPanel

if (this.Parent != null)
{
    var childs = ((DockPanel)this.Parent).Children;
    childs.Add(new UserControl1());
    childs.Remove(this);
}

完全取代MainWindow

C#Windows窗体

由于C#Windows窗体需要一个消息循环来保存WinForm应用程序,因此需要选择另一个选项而不是Form作为ApplicationContext之类的消息循环。

切入点

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(MainAppCxt.Instance);
}

MainAppCxt signleton ApplicationContext

internal class MainAppCxt : ApplicationContext
{
    #region Singleton --- we need only one instance for this
    private static readonly object Mutex = new object();
    private static volatile MainAppCxt _instance;

    public static MainAppCxt Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (Mutex)
                {
                    if (_instance == null)
                        _instance = new MainAppCxt();
                }
            }
            return _instance;
        }
    }
    #endregion

    public MainAppCxt()
    {
        ReplaceMainWindow(new Form1());
    }

    internal void ReplaceMainWindow(Form wnd)
    {
        var oldMainFrm = this.MainForm;
        this.MainForm = wnd;
        this.MainForm.Show();
        if (oldMainFrm != null && !oldMainFrm.IsDisposed)
            oldMainFrm.Close();
    }
}

要替换表单内的主要表单,只需

MainAppCxt.Instance.ReplaceMainWindow(new Form1());

WPF

例如,App.xaml仍然可以将StartupUri设置为MainWindow.xaml。但是创建新窗口就像

var cApp = ((App)Application.Current);
cApp.MainWindow = new SubWindow();
cApp.MainWindow.Show();
this.Close();

在其中替换"主窗口"角色。因此,如果您关闭窗口,例如SubWindow是主窗口,应用程序将关闭!

答案 1 :(得分:0)

我会将所有现有内容加载到合适的容器中(可能是Borders或Grids)。然后,我将第一个容器的Visible属性设置为False,将第二个容器的Visibility设置为True。具体如何实现该设置将取决于您是使用视图/代码隐藏模式还是MVVM。从你使用前者的东西看,所以它会是这样的:

在您的XAML中:

<Window>
    <Grid>
        <Grid x:Name="ContentGrid1" Visibility="Visible">
            <!-- Insert the first load of content here -->
        </Grid>
        <Grid x:Name="ContentGrid2" Visibility="Collapsed">
            <!-- Insert the second load of content here -->
        </Grid>
    </Grid>
</Window>

在你的代码隐藏中:

private void Button_Click(object sender, RoutedEventArgs e)
{
    //Collapse the first Grid, show the second:
    ContentGrid1.Visibility = System.Windows.Visibility.Collapsed;
    ContentGrid2.Visibility = System.Windows.Visibility.Visible;
}