【问题标题】:How do I open two windows on launch in WPF?如何在 WPF 中启动时打开两个窗口?
【发布时间】:2023-03-13 23:01:01
【问题描述】:

我觉得我在这里遗漏了一些非常基本的东西,但我似乎找不到答案。

当我的应用程序启动时,除了MainWindow.xaml 之外,我还希望打开基于现有xaml 的第二个window。我发现了很多关于使用代码隐藏创建一个新的window,但我想打开一个在另一个xaml 文件中预定义的window

两者都使用 MahApps 并被定义为

<Controls:MetroWindow x:Class=...
  ...
</Controls:MetroWindow>

第二个window 称为ControlWindow.xaml,与MainWindow.xaml 位于根目录中

谢谢

编辑:

当尝试在 app.xaml.cs 中的 App_Startup 事件中创建和显示窗口时,即使该窗口继承自与 MainWindow.xaml 相同的类,它也没有可用的 Show() 方法。

MainWindow.xaml.cs

using MahApps.Metro.Controls;

namespace RollCallDisplayDemo
{
    public partial class MainWindow : MetroWindow
    {        
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

ControlWindow.xaml.cs

using MahApps.Metro.Controls;

namespace RollCallDisplayDemo
{
    public partial class ControlWindow : MetroWindow
    {
        public ControlWindow()
        {
            InitializeComponent();
        }
    }
}

App.xaml.cs

using System.Windows;
using GalaSoft.MvvmLight.Threading;

namespace RollCallDisplayDemo
{
    public partial class App : Application
    {
        void App_Startup(object sender, StartupEventArgs e)
        {
            MainWindow NewWindowA = new MainWindow();
            ControlWindow NewWindowB = new ControlWindow();
        }

        static App()
        {
            DispatcherHelper.Initialize();
        }
    }
}

NewWindowA 的行为符合您的预期,并允许创建和显示一个新实例。 NewWindowB 只有 InitializeComponent 方法可用,没有其他应该从 MetroWindow 类继承的方法。

【问题讨论】:

  • 你可以挂钩到应用程序启动事件,然后从 App.Xaml.cs 文件中你可以做任何你想做的事情
  • 对,但是在订阅它之后,如何将预先存在的 xaml 文件作为新的单独窗口启动?我能找到的只是如何创建一个在代码隐藏中定义的新窗口。不确定投反对票的目的是什么......
  • 在 XAML 中,您定义一个窗口及其内容,但不要创建它。无论如何,您都必须使用new 运算符创建一个新窗口。您的MainWindow 也由new 运算符创建,您只是看不到它 - 框架对您隐藏了它。
  • 好的,我正在为我所看到的行为添加其他信息。

标签: c# wpf mvvm-light mahapps.metro


【解决方案1】:

您需要调用 NewWindowB.Show() 使其可见。此外,无需覆盖创建主窗口的方式,只需执行以下操作:

public partial class App : Application
{
    protected override void OnActivated(EventArgs e)
    {
        base.OnActivated(e);

        ControlWindow NewWindowB = new ControlWindow();
        NewWindowB.Show();
    }
}

【讨论】:

  • 谢谢马克。事实证明,必须重新构建解决方案才能使 Show() 方法在 NewWindowB 上可用。我很欣赏工作代码示例。
猜你喜欢
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2011-08-29
相关资源
最近更新 更多