WPF在主窗口前显示对话框
如何在主窗口之前显示对话框窗口(例如登录/选项等) 以下是我尝试过的(显然是,但不再是): XAML:WPF在主窗口前显示对话框,wpf,dialog,Wpf,Dialog,如何在主窗口之前显示对话框窗口(例如登录/选项等) 以下是我尝试过的(显然是,但不再是): XAML: <Application ... Startup="Application_Startup"> public partial class App : Application { private void Application_Startup(object sender, StartupEventArgs e) { Window1 myMa
<Application ...
Startup="Application_Startup">
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
Window1 myMainWindow = new Window1();
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
}
}
结果:首先显示myDialogWindow。当窗口关闭时,窗口1按预期显示。但是当我关闭Window1时,应用程序根本不会关闭。那么你想先显示一个窗口,然后显示另一个窗口,但在该窗口关闭时关闭应用程序?您可能需要将设置为OnMainWindowClose并将设置为Window1,如下所示:
Window1 myMainWindow = new Window1();
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
Application.Current.MainWindow = myMainWindow;
DialogWindow myDialogWindow = new DialogWindow();
myDialogWindow.ShowDialog();
来,像这样做。这将实际更改主窗口并正常工作,而不必更改应用程序对象的设置 确保删除应用程序启动的事件处理程序,并在app.xaml文件中设置StartupUri
public partial class App : Application
{
bool init = false;
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
if (!init)
{
this.MainWindow.Closing += new System.ComponentModel.CancelEventHandler(MainWindow_Closing);
init = true;
}
}
void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Window toClose = this.MainWindow;
this.MainWindow = new Window2();
this.MainWindow.Show();
}
}
好吧,抱歉,这是解决方案: 我最初的问题几乎奏效了,只需要添加一件事,从应用程序XAML中删除StartupUri,然后将Show添加到主窗口 即:
<Application x:Class="DialogBeforeMainWindow.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="Application_Startup">
以下是对我有效的完整解决方案: 在App.xaml中,我删除
StartupUri
内容,并添加Startup
处理程序:
<Application x:Class="MyNamespace.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="ApplicationStart">
</Application>
WPF将App.Current.main窗口设置为打开的第一个窗口。如果您可以控制辅助窗口构造函数,只需在那里设置
App.Current.MainWindow=Null
。构建主窗口后,它将按预期分配给App.Current.MainWindow
属性,无需任何干预
public partial class TraceWindow : Window
{
public TraceWindow()
{
InitializeComponent();
if (App.Current.MainWindow == this)
{
App.Current.MainWindow = null;
}
}
}
如果您没有访问权限,仍然可以在主窗口的构造函数中设置
MainWindow
。如果您将Application.Current.ShutdownMode=ShutdownMode.OnExplicitShutdown将>编码到对话框的构造函数中,然后添加
protected override void OnClosed(EventArgs e) {
base.OnClosed(e);
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
}
在dialog类中,您不必担心对应用程序的默认行为进行任何更改。如果您只想将登录屏幕捕捉到一个已经存在的应用程序中,而不需要调整启动过程,这将非常有用。您可以粘贴整个应用程序类吗?(这不起作用(应用程序永远不会关闭),我尝试过的修改版本也不起作用)如果你看我粘贴的链接,它说主窗口已经设置好了…简单调试确认了主窗口,我在关机模式下放置的任何东西都无关紧要。我会尝试一下,但你知道,这不是“正确”的方式。必须有一些好的方法来做到这一点。我在启动时搜索的每个地方都已填充或覆盖。。。它甚至可以获取命令行参数。此外,我还试图为我的应用程序类创建“Run”函数,如果我这样做,除非我将base.Run(…)放进去,否则不会显示任何内容。因此,这可能是一个需要注意的问题。您仍然可以覆盖OnStartup来处理运行时参数等。为什么这不是一个“正确”的方法呢?这个很好用。它不优雅,这件事应该很简单。事实上,但也向你道歉,我把我的问题搞砸了应用程序标签中的“…”太多了。是的,应该有一种更优雅的方式来做这件事,但我没有找到它。克里斯,我自己回答了这个问题,有1分,我相信这是“正确的”。这对我来说不起作用,DialogWindow关闭后应用程序关闭。对我也不起作用-OK=Main显示良好。取消=挂起,即不关闭。答案需要修改。毫无疑问,这是最容易实现的解决方案。它可能不是纯粹的mvvm(即在代码背后绝对没有代码),但我不认为添加这一点会有多大区别,至少也不会有很大的改型优势。没有必要删除StartupUri来实现相同的结果。重要的一点是在对话框之前更改关机模式,然后在对话框之后更改回关机模式。在我们能够做到的地方,我们应该致力于只在过于复杂或效率低下而无法用xaml表达时,才使用代码隐藏来扩充设计器。在本例中,我们都希望Xaml中的一个属性比条件逻辑中隐藏的两行要好。请注意,默认的Current.ShutdownMode是ShutdownMode.OnLastWindowClose对于那些只复制和粘贴上面代码的人来说。
public partial class TraceWindow : Window
{
public TraceWindow()
{
InitializeComponent();
if (App.Current.MainWindow == this)
{
App.Current.MainWindow = null;
}
}
}
protected override void OnClosed(EventArgs e) {
base.OnClosed(e);
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
}