Как я могу предоставить фокус созданному окну вместо создания нового экземпляра? - PullRequest
1 голос
/ 09 января 2012

Я нашел так много тем о том, как предотвратить несколько экземпляров Windows.Forms, но я все еще не могу найти, как предотвратить несколько экземпляров для окон WPF.Я объясню свою идею.У меня есть окно WPF.В этом окне есть красивая пользовательская кнопка.При нажатии кнопки открывается новое окно.Моя проблема в том, что когда я нажимаю несколько раз на одну и ту же кнопку, появляется одно и то же окно столько раз, сколько я нажимал на кнопку.Как это предотвратить?Возможно ли вместо этого открыть новое окно, просто уже открытое, чтобы сфокусироваться?

Ответы [ 3 ]

2 голосов
/ 09 января 2012

Что ж, вы должны проверить, создан ли он, прежде чем создавать новый:

Псевдоподобный код (здесь есть только блокнот)

private YourWindow wnd = null;

void OnButton_Click()
{
    if (wnd == null) wnd = new YourWindow();
    wnd.Show();
}
1 голос
/ 09 января 2012

Я склонен использовать два подхода.Иногда я делаю то, что предлагает 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 () делает все необходимое, чтобы сделать его видимым и вывести его на передний план или что-то еще.На самом деле самая большая вещь, которую я могу сделать, это внутри интерфейса с вкладками, так что все это запускается окном оболочки.

Это немного похоже на ответ Кевина Росса, за исключением того, что я индексирую коллекцию потип.Очевидно, что это не сработает, если вам когда-нибудь понадобится несколько окон, которые являются экземплярами одного и того же класса, и тогда вам захочется что-то более похожее на то, что сделал Кевин.Мой строго типизированный фон функционального программирования говорит, что я бы предпочел использовать хорошее перечисление для индексации окон, а не строку.

1 голос
/ 09 января 2012

Я видел несколько методов, и это тот, который я использую.Это в VB, но вы должны быть в состоянии преобразовать его в C #.Возможно, есть лучшие способы, но я не эксперт WPF!

У меня есть функция, скрытая в модуле, который выглядит следующим образом

 Public Class FormsCollection
        Public Shared Forms As ArrayList = New ArrayList
    End Class

    Public Function Find_form(strForm_name As String)
        For Each F In FormsCollection.Forms
            If F.ToString = strForm_name Then
                Find_form = F
                Exit Function
            End If
        Next
        Find_form = Nothing
    End Function

Затем, когда я пытаюсь открытьформа код выглядит так

Dim FormToOpen As FormToOpen
            If IsNothing(Find_form("FormToOpen")) Then
                FormToOpen = New FormToOpen
            Else
                FormToOpen = Find_form("FormToOpen ")
            End If
            With FormToOpen
                .Owner = Me
                .ShowDialog()
            .Activate
                        End with
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...