Wpf MainWindow инкапсулирует несколько окон - заставляет StartupUri показывать много окон - PullRequest
1 голос
/ 22 февраля 2012

Цель состоит в том, чтобы создать объект, который содержит несколько окон 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 ]

1 голос
/ 10 апреля 2012

Я нашел способ сделать это, сделав все мои подклассы окон 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();

PS Я хотел бы, чтобы Microsoft использовала интерфейсы во всех .NET, работая с интерфейсом IWindow, а не с конкретным классом Window, что обеспечило бы гораздо большую мощность и в этом случае также простоту реализации.

1 голос
/ 22 февраля 2012

Я считаю, что startupuri позволит вам открывать окна при запуске приложения. Если вы хотите открывать окна при запуске приложения, вы можете сделать это следующим образом.

Существует файл App.xamlперейдите в файл App.xaml.cs.

, пожалуйста, попробуйте ... после

  1. Удалите StartupUri = "MainWindow.xaml" в файле App.xaml.
  2. Класс приложения, унаследованный от Application.Вы можете переопределить 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();
            }
        }
    

Я не уверен, что это то, что вы хотите.Я надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...