Я склонен использовать два подхода.Иногда я делаю то, что предлагает PowerRoy, и храню поле в подходящем центральном месте в приложении, которое имеет ссылку на окно.Если это поле не равно нулю, я активирую его вместо создания нового экземпляра.
Иногда, когда существует много типов окон, но я хочу только одно из них, я использую список общего базового класса (Список возможно).Каждое созданное окно помещается туда, и всякий раз, когда я хочу создать или переключиться на одно из них, я фильтрую его по типу и проверяю, есть ли там что-нибудь, и переключаюсь на него, если оно есть.Что-то вроде:
List<Window> allWindows = new List<Window>();
// ... elsewhere I want to create a ShinyWindow
void ActivateShinyWindow()
{
var shiny = allWindows.OfType<ShinyWindow>().FirstOrDefault();
if (shiny == null)
{
shiny = new ShinyWindow();
allWindows.Add(shiny);
}
ActivateWindow(shiny);
}
Где ActivateWindow () делает все необходимое, чтобы сделать его видимым и вывести его на передний план или что-то еще.На самом деле самая большая вещь, которую я могу сделать, это внутри интерфейса с вкладками, так что все это запускается окном оболочки.
Это немного похоже на ответ Кевина Росса, за исключением того, что я индексирую коллекцию потип.Очевидно, что это не сработает, если вам когда-нибудь понадобится несколько окон, которые являются экземплярами одного и того же класса, и тогда вам захочется что-то более похожее на то, что сделал Кевин.Мой строго типизированный фон функционального программирования говорит, что я бы предпочел использовать хорошее перечисление для индексации окон, а не строку.