2016-05-09 2 views
0

Я разрабатываю плагин, который открывает приложение MainWindow. Я использую C# и WPF.Окно 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

Почему закрытие окна делает _anything_ с помощью ссылка, которую вы держите? Вы не передаете 'ref Window' в метод' Close', поэтому не может быть никакого способа. – Joey

ответ

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; 
    } 
} 
+0

Ну, это работает для проблемы, которую я задаю, но теперь я могу открыть одно и то же окно несколько раз:/ – Babuh

+0

Извините, я не совсем понимаю. Если это работает (я уверен, что это так, я тоже его использую) - почему вы можете открыть окно несколько раз? –

+0

Мой «MainWindow» должен быть открыт один раз за раз. Если я назову его второй раз, он должен сделать его активным, но не создать новый. – Babuh

1

Как только вы закроете окно wpf, вы не сможете его повторно открыть по умолчанию. Чтобы обойти это, вам нужно переопределить метод OnClosing, чтобы установить видимость окна в скрытое и отменить событие закрытия.

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    this.Visibility = Visibility.Hidden; 
    e.Cancel = true; 
} 

Если вы хотите, чтобы остановить Serveral версии ваше окно быть открытым сразу, то вы могли бы рассмотреть вопрос об использовании ShowDialog() вместо Show(). Это блокирует фоновое приложение, пока ваше окно не будет закрыто. Вам все равно придется переопределить метод OnClosing, если вы хотите повторно использовать тот же экземпляр вашей формы.

Смежные вопросы