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

时间:2012-02-21 23:29:58

标签: c# .net wpf user-interface window

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

现在因为WPF是一个单窗口架构,我想将这个Windows列表包装在一个Window对象中,以便它可以设置为StartupUri,例如

  • 我知道我可以在Show()启动中手动Window每个Application,但这不是重点 - 我需要一组粘在一起的窗口,我可以轻松地调用它们在我的代码库中的任何地方,知道我有一个关注链接的类。
  • 此处对多文档界面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生命周期,无论如何我可以取消初始化并显示已注册窗口的列表吗?

2 个答案:

答案 0 :(得分:1)

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

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

请尝试......以下

  1. 删除App.xaml文件中的StartupUri =“MainWindow.xaml”。
  2. 从Application继承的App类。您可以覆盖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();
            }
        }
    
  3. 我不确定这是你想要的。我希望这有帮助。

答案 1 :(得分:1)

我找到了一种方法来实现它,这是通过使我的所有窗口子类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

调用覆盖成员
// 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。我希望Microsoft在整个.NET中使用接口,使用IWindow接口而不是具体的Window类将提供更多功能,在这种情况下,也易于实现。