我正在开发一个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
事件,还是有其他方法?
我在这种情况下使用经理类。它跟踪所有已注册的窗口类型并订阅该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;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句