WPF在主窗口前显示对话框

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

如何在主窗口之前显示对话框窗口(例如登录/选项等)

以下是我尝试过的(显然是,但不再是):

XAML

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