Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Wpf主窗口封装多个窗口-使StartupUri显示多个窗口_C#_.net_Wpf_User Interface_Window - Fatal编程技术网

C# Wpf主窗口封装多个窗口-使StartupUri显示多个窗口

C# Wpf主窗口封装多个窗口-使StartupUri显示多个窗口,c#,.net,wpf,user-interface,window,C#,.net,Wpf,User Interface,Window,其目的是创建一个包含多个WPF窗口的对象,这些窗口表示一个应始终显示在一起的单元,每个窗口保留其各自的职责-例如选择在屏幕X上布局 现在,由于WPF是一个单窗口体系结构,我想将此窗口列表包装在一个窗口对象中,以便将其设置为StartupUri,例如 我知道我可以手动Show()启动Application中的每个Window,但这不是重点-我需要一个可以粘在一起的窗口集合,我可以轻松地调用代码库中的任何地方,因为我知道我有一个类负责链接 这里对多文档接口MDI不感兴趣 我不知道如何实现这样一个

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

现在,由于WPF是一个单窗口体系结构,我想将此窗口列表包装在一个
窗口
对象中,以便将其设置为StartupUri,例如

  • 我知道我可以手动
    Show()
    启动
    Application
    中的每个
    Window
    ,但这不是重点-我需要一个可以粘在一起的窗口集合,我可以轻松地调用代码库中的任何地方,因为我知道我有一个类负责链接
  • 这里对多文档接口MDI不感兴趣
我不知道如何实现这样一个适配器,我试图覆盖
BeginInit
,但根本没有被调用

如何停止窗口初始化
公共类多窗口:窗口
{
私有只读IList_windows=new List();
公共作废登记簿(窗口)
{
_添加(窗口);
}
public override void BeginInit()
{
foreach(窗口中的变量w)
w、 Show();
//base.BeginInit();
}
}

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

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

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

请尝试以下内容

  • 删除App.xaml文件中的StartupUri=“MainWindow.xaml”
  • 从应用程序继承的应用程序类。您可以重写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();
            }
        }
    
    公共部分类应用程序:应用程序
    {
    私有只读IList_windows=new List();
    启动时受保护的覆盖无效(StartupEventArgs e)
    {
    基础。启动时(e);
    //在此处添加要打开的窗口。
    foreach(窗口中的变量w)
    {
    w、 Show();
    }
    }
    

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

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

    • 现在,当您调用
      .Show()
      时,它将显示一个窗口或多个窗口,具体取决于子类中封装的内容
    所有窗口对象都应从BaseWindow继承 重写BaseShow() 使用多窗口,但通过BaseWindow调用重写的成员
    另外,我希望微软在整个.NET中使用接口,使用IWindow接口而不是具体的窗口类,能够提供更大的功能,在这种情况下,也更易于实现。

    这些窗口是在哪里创建的?您计划如何处理Close()如果您需要一个集合保持在一起,则在窗口上发生事件。功能要求是什么?@BalamBalam在应用程序的整个生命周期中都会注册这些窗口,在我考虑的特定场景中,无论何时将新的显示器连接到计算机上,都会创建这些窗口(并且在移除辅助屏幕时实际上未注册)。此外,假设有双监视器(所以有两个窗口),然后在某些时候,窗口可能会被隐藏,然后需要再次显示在一起。因此,这里的代码并不完全适合,但用于说明问题。我还没有考虑过处理方法,因为我不确定如何像那样动态分组繁殖。好的,但是“应用程序”在哪里“在整个应用程序生命周期中注册“?这些窗口是在哪里创建的。我们说的是WPF窗口?页面或对话框呢?@BalamBalam在这种情况下,负责创建新窗口的工厂是一个类,它可以检测何时打开更多/新的显示,这可以在应用程序运行时随时发生。”(同样适用于注销;应用程序在后台/系统托盘中保持活动状态)。例如,当用户单击任务栏图标时,所有已注册的窗口都会显示。因此,问题仍然是如何将窗口对象聚集在一起,而不是页面或任何其他ui元素。感谢您提供的代码,但这不是我想要的,即。“我需要一组可以粘在一起的窗口,我可以在代码库的任何地方轻松调用这些窗口,因为我知道我有一个类负责链接”
        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();
            }
        }
    
    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 
    }
    
    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();
        }       
    }
    
     // First Window object instantiated becomes WPF MainWindow     
     var multiWindow = new MultiWindow();
     multiWindow.Register(new WindowA());
     multiWindow.Register(new WindowB());
    
    // Cast down to BaseWindow in order to call the overriden member
    var baseWindow = (BaseWindow)Application.Current.MainWindow;
    // Show WindowA and WindowB
    baseWindow.Show();