Триггер события (кнопка), открывающий несколько экземпляров одного и того же окна - PullRequest
1 голос
/ 26 ноября 2011

В моем приложении WPF у меня есть главное окно (Branch.xaml), в котором есть кнопка, которая откроет другое окно (Location.xaml). Как только это окно Местоположения открыто, как я могу препятствовать открытию другого экземпляра этого окна Местоположения, когда пользователь снова нажимает ту же кнопку?

Или как мне перефокусировать то же открытое окно, когда пользователь снова нажимает кнопку?

Код нажатия кнопки - это автоматически генерируемый код, если дважды щелкнуть кнопку в xaml.

В файле "Branch.xaml.cs" код для нажатия кнопки выглядит следующим образом:

private void rbtn_Location_Click(object sender, RoutedEventArgs e) 
{ 
    Location location = new Location(); 
    location.Show(); 
} 

Location - это пользовательский класс, который открывает окно с 3 списками

Спасибо, любая помощь приветствуется. Я использую приложение WPF на C # 4.0 и Visual Studio 2010.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2011

Коллекция Application.Current.Windows содержит ссылку на все окна для текущего AppDomain .Вы можете проверить свое окно в этой коллекции и, если оно будет найдено в вашем окне, позвоните Activate для этого окна, иначе создайте новое окно .Это поможет вам -

private void rbtn_Location_Click(object sender, RoutedEventArgs e) 
{ 
    Window window = Application.Current.Windows.OfType<Window>().Where(win => win.Name == "LocationWindow").FirstOrDefault();
    if(window == null)
    {
       Location location = new Location(); 
       location.Show(); 
    }
    else
    {
       window.Activate();  
    }
} 

Убедитесь, что вы предоставили свое окно x:Name в качестве LocationWindow, чтобы оно работало.

<Window x:Name="LocationWindow">
</Window>

Также включите пространство имен System.Linq в свой кодпозади.

0 голосов
/ 26 ноября 2011

Вы можете создать поле в главном окне, которое содержит ссылку на окно местоположения, если оно есть, в обработчике щелчков кнопки проверьте, является ли поле пустым, и создает ли оно новое окно, и сохраните его в этом поле. , если нет, позвоните Activate в окне в поле. Вам также придется подписаться на событие Closed окна местоположения, чтобы снова очистить ссылку, когда окно местоположения исчезнет.

Редактировать: Конкретный пример:

private LocationWindow locationWindow;
private void Button1_Click(object sender, RoutedEventArgs e)
{
    if (locationWindow == null)
    {
        locationWindow = new LocationWindow();
        locationWindow.Closed += (s, _) => locationWindow = null;
        locationWindow.Show();
    }
    else
    {
        locationWindow.Activate();
    }
}
...