有一种老式的方法可以使用界面来执行此操作。我在 Java 中将此视为一种弥补没有代表的方式(如果我错了,请纠正我)。此方法将允许您检查是否已经打开了一个窗口(任何类型的)。原始响应效果很好,但您也可以通过以下方式进行操作:
创建界面
public interface IWindowTracker
{
void WindowIsOpened();
void WindowIsClosed();
}
在父级上实现接口(从您打开的位置):
public partial class MainWindow : Window, IWindowTracker
在您的构造函数中,接受一个属于 IwindowTracker 接口的对象。保存实例以备将来使用
IWindowTracker windowTracker;
public ProjectManager(IWindowTracker parentWindowTracker)
{
windowTracker = parentWindowTracker;
InitializeComponent();
}
设置对窗口跟踪器对象的调用
protected override void OnActivated(EventArgs e)
{
windowTracker.WindowIsOpened();
base.OnActivated(e);
}
protected override void OnClosed(EventArgs e)
{
windowTracker.WindowIsClosed();
base.OnClosed(e);
}
最后在你的父 WPF 窗口中实现 IWindowTracker
bool windowIsOpen = false;
public void WindowIsOpened()
{
windowIsOpen = true;
}
public void WindowIsClosed()
{
windowIsOpen = false;
}
这将允许您跟踪窗口是否仍然打开,如果是,则无需打开它的新实例:
if (!windowIsOpen)
{
remoteProjectManager = new ProjectManager(this);
remoteProjectManager.Show();
}
remoteProjectManager.Focus();
在关闭的窗口上调用 show() 似乎会抛出异常,所以我的猜测是还有其他方法,或者如果您关闭了窗口,则从技术上讲,该窗口已“销毁”
这样做的好处是我可以检测窗口是否仍然打开并专注于它(以便它再次出现在前面)。
注意:这有一个缺点,因为在此设置中,它限制您一次只能打开一个窗口(假设您的所有窗口都是这样实现的)。就我而言,我只想在主窗口之外打开一个窗口。
您可能还想检查您的窗口是否为空,考虑到它可能不是您必须打开的唯一窗口。