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