我想制作一个小程序我想用WP在WPF中打开一个新窗口。它是,但它就像mainWindow关闭,然后另一个窗口打开,我想,它会流畅"流畅",所以你认为它是一个窗口.. 这是我为它写的代码:
private void Button_Click(object sender, RoutedEventArgs e)
{
Window1 w = new Window1();
this.Hide();
w.Show();
}
你会怎么做?
答案 0 :(得分:1)
我在WPF上没有太多经验。但是我之前见过的太多类似的案例,以及Windows Form&在这样的问题上,WPF没有太多差异。我在这里尝试回答,在我的电脑上进行测试,看看我给出的这些意见是否有帮助。
TL; DR :见最后一段。
将有3种方式(或更多?)来实现:
就像您粘贴给我们的代码一样。 Hide()
主窗口,Show()
子窗口。
然而这确实是我建议您使用的最后一个选项,因为当您有许多窗口要关闭/ Hide()
和Show()
时,它会变成。您将导致不知道您的打开窗口的堆栈如何。
这需要在User Control中创建所有内容并实现行为。然后,主窗口将成为用户控件停靠在其中的容器UserControl.Dock = DockStyle.Fill
。
主窗口可能有一个停靠在顶部的菜单栏,它总是可以在不同的屏幕上看到'如果没有其他配置。
从UserControl更改窗口的对接UserControl:
this.Parent.Controls.Add(new UserControl1()
{
Dock = DockStyle.Fill
});
this.Parent.Controls.Remove(this);
主窗口应包含以示例mainDock
命名的 DockPanel :
if (this.Parent != null)
{
var childs = ((DockPanel)this.Parent).Children;
childs.Add(new UserControl1());
childs.Remove(this);
}
由于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());
例如,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;
}