我正在开发一个从应用程序中打开MainWindow
的插件。我使用的是C#和WPF。
public class StartRIR : IExternalCommand
{
private static MainWindow mainwindow;
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
if (mainwindow != null)
{
mainwindow.Focus();
return Result.Succeeded;
}
else
{
mainwindow = new MainWindow(commandData);
mainwindow.Show();
return Result.Succeeded;
}
}
}
当我调用外部应用程序时执行此代码,目标是避免多个MainWindow
同时打开。
但如果我关上窗户,我就不能打开它了。是否意味着关闭窗口不要将其设置为null?我是否必须覆盖Closing
事件或是否有其他方式?
答案 0 :(得分:2)
关闭wpf窗口后,默认情况下无法重新打开它。要绕过这个,你需要覆盖OnClosing方法,将窗口可见性设置为隐藏,并取消close事件。
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
this.Visibility = Visibility.Hidden;
e.Cancel = true;
}
如果您希望立即停止打开窗口的几个版本,则可以考虑使用ShowDialog()而不是Show()。这将锁定后台应用程序,直到您的窗口关闭。如果要重新使用表单的完全相同的实例,则仍需要覆盖OnClosing方法。
答案 1 :(得分:0)
我正在使用经理类来处理这类案件。它跟踪所有已注册的窗口类型并订阅Closed
事件。
public class SingleWindowTypeHelper
{
public SingleWindowTypeHelper()
{
_windows = new List<Window>();
}
private readonly List<Window> _windows;
public T GetExistingWindow<T>()
{
return _windows.OfType<T>().FirstOrDefault();
}
public bool ShowExistingWindow<T>() where T : Window
{
T window = GetExistingWindow<T>();
if (window == null) return false;
if (window.WindowState == WindowState.Minimized)
window.WindowState = WindowState.Normal;
window.Activate();
return true;
}
public void AddNewWindow(Window window)
{
_windows.Add(window);
window.Closed += WindowOnClosed;
window.Show();
window.Activate();
}
private void WindowOnClosed(object sender, EventArgs eventArgs)
{
Window window = sender as Window;
if (window == null) return;
window.Closed -= WindowOnClosed;
_windows.Remove(window);
}
}
要使用它,您只需在代码中的某个位置
private readonly SingleWindowTypeHelper _windowHelper = new SingleWindowTypeHelper();
并检查这样的现有窗口:
if (_windowHelper.ShowExistingWindow<YourWindowType>()) return;
YourWindowType dialog = new YourWindowType();
// do some additional initialization here
_windowHelper.AddNewWindow(dialog);
或在你的情况下:
public class StartRIR : IExternalCommand
{
private static readonly SingleWindowTypeHelper _windowHelper =
new SingleWindowTypeHelper();
public Result Execute(
ExternalCommandData commandData,
ref string message,
ElementSet elements)
{
if (_windowHelper.ShowExistingWindow<MainWindow>())
return Result.Succeeded;
MainWindow dialog = new MainWindow(commandData)();
_windowHelper.AddNewWindow(dialog);
return Result.Succeeded;
}
}