关闭它时,WPF窗口不设置为null

时间:2016-05-09 10:14:46

标签: c# wpf

我正在开发一个从应用程序中打开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事件或是否有其他方式?

2 个答案:

答案 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;
    }
}
相关问题