WPF在主窗口之前显示对话框

Cia*_*tic 42 wpf dialog

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

这是我尝试过的(它显然曾经有过,但现在不再有了):

XAML:

<Application ...
    Startup="Application_Startup">
Run Code Online (Sandbox Code Playgroud)

申请:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Window1 myMainWindow = new Window1();
        DialogWindow myDialogWindow = new DialogWindow();
        myDialogWindow.ShowDialog();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:首先显示myDialogWindow.关闭时,Window1将按预期显示.但是当我关闭Window1时,应用程序根本没有关闭.

Gle*_*eno 74

这是适合我的完整解决方案:

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>
Run Code Online (Sandbox Code Playgroud)

App.xaml.cs中,我按如下方式定义处理程序:

public partial class App
{
    private void ApplicationStart(object sender, StartupEventArgs e)
    {
        //Disable shutdown when the dialog closes
        Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

        var dialog = new DialogWindow();

        if (dialog.ShowDialog() == true)
        {
            var mainWindow = new MainWindow(dialog.Data);
            //Re-enable normal shutdown mode.
            Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
            Current.MainWindow = mainWindow;
            mainWindow.Show();
        }
        else
        {
            MessageBox.Show("Unable to load data.", "Error", MessageBoxButton.OK);
            Current.Shutdown(-1);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 没有必要删除StartupUri以实现相同的结果.重要的一点是在对话框之前更改关闭模式,然后在对话框之后将其更改回来.在我们能够做到的地方,我们应该专注于使用代码来增强设计器,只有当它过于复杂或低效才能在xaml中表达时.在这种情况下,我们所期望的Xaml中的一个属性优于隐藏在条件逻辑中的2个行. (3认同)

Cia*_*tic 6

好的道歉,这是解决方案:

我的原始问题几乎起作用,只需添加一件事,从Application 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">
Run Code Online (Sandbox Code Playgroud)

上面,StartupUri已删除.

添加myMainWindow.Show():

public partial class App : Application
{

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Window1 myMainWindow = new Window1();
        DialogWindow myDialogWindow = new DialogWindow();
        myDialogWindow.ShowDialog();
        myMainWindow.Show();
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说不起作用,在DialogWindow关闭后应用程序关闭. (2认同)

Jam*_*rda 5

WPF 设置App.Current.MainWindow为打开的第一个窗口。如果您可以控制辅助窗口构造函数,只需在App.Current.MainWindow = Null那里设置。主窗口构建完成后,它将App.Current.MainWindow按预期分配给属性,无需任何干预。

public partial class TraceWindow : Window
{
    public TraceWindow()
    {
        InitializeComponent();
        if (App.Current.MainWindow == this)
        {
            App.Current.MainWindow = null;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您无权访问,您仍然可以MainWindow在主窗口的构造函数中进行设置。