Wpf MainWindow封装多个窗口-使StartupUri显示多个窗口



目标是创建一个包含多个WPF窗口的对象,这些窗口将代表一个应该始终显示在一起的单元,每个Window保留其各自的职责-比如选择在屏幕X上布局。。。

现在,因为WPF是一个单窗口体系结构,我想将这个Windows列表封装在一个Window对象中,这样它就可以设置为StartupUri。

  • 我知道我可以在Application启动中手动Show()每个Window,但这不是重点——我需要一个粘在一起的窗口集合,我可以很容易地调用代码库中的任何地方,因为我知道我有一个类负责连接
  • 此处对多文档接口MDI不感兴趣

我不知道如何实现这样一个适配器,我试图覆盖BeginInit,但根本没有被调用。

如何停止窗口初始化

public class MultiWindow : Window
{
    private readonly IList<Window> _windows = new List<Window>();
    public void Register(Window window)
    {
        _windows.Add(window);
    }
    public override void BeginInit()
    {
        foreach (var w in _windows)
            w.Show();
        // base.BeginInit();
    }
}

我不太了解Window的生命周期,是否可以取消初始化并显示已注册窗口的列表

我相信startupuri将允许您在应用程序启动时打开窗口如果你想在应用程序启动时打开窗口,你可以这样做。

有App.xaml文件,请转到App.xaml.cs文件。

请尝试。。。跟随

  1. 在App.xaml文件中删除StartupUri="MainWindow.xml"
  2. 从应用程序继承的应用程序类。您可以重写OnStartup()来自定义应用程序的启动时间。

        public partial class App : Application
        {
          private readonly IList<Window> _windows = new List<Window>();
          protected override void OnStartup(StartupEventArgs e)
          {
            base.OnStartup(e);        
            // Add windows you want to open here.
            foreach (var w in _windows)
            {
              w.Show();
            }
        }
    

我不确定这是否是你想要的。我希望这能有所帮助。

我找到了一种方法,那就是让我的所有窗口都成为BaseWindow的子类,用于普通的单个Window对象和实际包含多个窗口的Window对象。

  • 现在,当您调用.Show()时,它将显示一个或多个窗口,这取决于子类中封装的内容

所有Window对象都应继承自BaseWindow

public class BaseWindow : Window
{
    
    // Hide default implementation and call BaseShow instead
    public new void Show()
    {
        BaseShow();
    }
    protected virtual void BaseShow()
    {
        base.Show();
    }
    // ... abstract away any additional Window methods and properties required 
}

覆盖BaseShow()

public class MultiWindow : BaseWindow
{        
    private readonly IList<Window> _windows = new List<Window>();
    public void Register(Window window)
    {
        _windows.Add(window);
    }
    protected override void BaseShow()
    {
        foreach (var w in _windows)
           w.Show();
    }       
}

在应用程序启动中设置MultiWindow

 // First Window object instantiated becomes WPF MainWindow     
 var multiWindow = new MultiWindow();
 multiWindow.Register(new WindowA());
 multiWindow.Register(new WindowB());

使用MultiWindow,但通过BaseWindow调用overriden成员

// Cast down to BaseWindow in order to call the overriden member
var baseWindow = (BaseWindow)Application.Current.MainWindow;
// Show WindowA and WindowB
baseWindow.Show();

p.S.我希望微软在整个.NET中使用接口,使用IWindow接口而不是具体的Window类将提供更强大的功能,在这种情况下,还易于实现

最新更新