2016-06-11 3 views
0

У меня есть проблема с возможностью выбора кнопки один раз, когда она открыта, что я делаю неправильно?Кнопка щелкнула один раз

private Boolean buttonWasClicked = false; 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     buttonWasClicked = true; 



     if (buttonWasClicked == true) 
     { 
     new SettingsWindow().Show(); 
     var test = new SettingsWindow(); 
     test.Owner = System.Windows.Application.Current.MainWindow; 
     test.WindowStartupLocation = WindowStartupLocation.CenterOwner; 
     test.Top = this.Top + 20; 

     } 
     else { 

      buttonWasClicked = false; 
     } 


    }` 
+0

Winform или ASP.NET? Что вы пытаетесь сделать BTW? – Rahul

+0

с использованием WPF в визуальной студии C# – Tjarda112

+0

Вы создаете две копии 'SettingsWindow', вы, вероятно, не хотите, чтобы –

ответ

3

Я бы не стал менять свой собственный флаг и управлять его настройкой вручную. Например, если пользователь закрывает окно, как вы меняете обратно переменную, чтобы снова открыть окно настроек ?. По этой проблеме существует более надежный системный подход. Глядя на предоставленную системой информацию, вы сможете не открывать второй раз окно настроек, пока не будет открыт один экземпляр.

Чтобы проверить, есть ли уже экземпляр SettingsWindow открыть, вы можете использовать информацию, предоставляемую систему с кодом, как этот

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    // Check if, in the Application.Current.Windows collection 
    // there is at least one window of type SettingsWindow 
    SettingsWindow w = Application.Current.Windows 
            .OfType<SettingsWindow>() 
            .FirstOrDefault(); 

    if(w == null) 
    { 
     // No window of the type required, open a new one.... 
     w = new SettingsWindow(); 
     w.Owner = System.Windows.Application.Current.MainWindow; 
     w.WindowStartupLocation = WindowStartupLocation.CenterOwner; 
     w.Top = this.Top + 20; 
    } 

    // Show it NON MODALLY.... 
    w.Show(); 
} 

Призыв к Show возвращается немедленно (не модальна) и, таким образом, ваша программа продолжит как обычно, при включенном MainWindow.
Вместо этого, если вы хотите использовать модальный подход (это означает, что до тех пор, пока SettingsWindow не будет открыт в вашем MainWindow, вы можете просто создать SettingsWindow, установить его владельца и, в конечном итоге, его позицию и, наконец, позвонить ShowDialog (не забывайте для установки свойства Owner). Таким образом, ваш код блокируется в ShowDialog и не возвращается, пока пользователь не закрывает только что открытый экземпляр SettingsWindow. (И вы можете удалить все проверки выше)

+0

Спасибо! Это то, что я ищу –

0

Довольно уверен, что это всегда будет верно Go с отличным ответ от Стива

buttonWasClicked = true; 
if (buttonWasClicked == true) 
{ 
    // this will execute every time 
} 
else 
{ 
    // this will never execute 
} 
Смежные вопросы