2013-11-12 2 views
1

У меня есть TextBox, для которого я хотел бы выполнить несколько условий в зависимости от того, введено ли в нем целое число. Мои операции происходят из отделенного кода окна, что TextBox существует вЗамечание о методах TextBox

Под LostFocus случае я хотел бы сделать следующее:.

  • Проверьте, если stringIsNullOrEmpty

    -Если это - задан текст в «Запись по умолчанию»

  • Убедитесь, что введенное значение является Int

    Если это не так - Отображение MessageBox(Ok Button), затем установите фокус назад на TextBox

** Это то, что моя LostFocus функция выглядит следующим образом:

выше функция работает хорошо для тестирования: stringIsNullOrEmpty, но у меня возникают проблемы с состоянием else if. Когда я пытаюсь сбросить фокус обратно на TextBox, я получаю бесконечный цикл MessageBoxes. Почему это и как я могу это исправить?

Update 1:

Эти дополнительные обработчики событий на TextBox:

//State of View at startup 
private void Document_Loaded(object sender, RoutedEventArgs e) 
{ 
    //This is run because I need the TextBox to have focus at window startup 
    TextBox.Focusable = true; 
    TextBox.Focus(); 
} 

XAML:

<UserControl Loaded="Document_Loaded" ... > 
+1

У вас есть какие-либо другие обработчики событий на текстовом поле, или какой-либо код не отображается в этот обработчик? – Servy

+0

Да, у меня много. Это будет очень много, если я опубликую все это. Что я должен искать, это испортит этот процесс? –

+0

@Ericafterdark, 'другие обработчики событий в текстовом поле'. –

ответ

1

Не пытайтесь установить фокус внутри Enter, GotFocus оставляй, LostFocus, проверки или апробированные обработчики событий. Это может привести к приложения или операционной системы, перестает отвечать на запросы ...

От MSDN

+0

Тогда как я должен был основывать эти действия у пользователя, оставив «TextBox»? –

+0

Вы _can_ показываете 'MessageBox'. Просто не перефокусируйтесь. – ispiro

+0

@ Ericafterdark Вы не являетесь. В этом-то и дело. Несмотря на это, это очень плохой дизайн для пользователей, чтобы они не удаляли фокус из текстового поля до тех пор, пока оно не будет исправлено. Просто запретите им выполнять какие-либо действия, зависящие от этого текстового поля, имеющего допустимое значение (т. Е. Отключить связанные кнопки), вместо того, чтобы заставлять фокус в текстовом поле. – Servy

0

При попытке сбросить фокус обратно на TextBox Я получаю бесконечный цикл MessageBoxes

Это происходит потому, что вы вызываете фокус управления TextBox, только когда событие LostFocus поднимается. Когда вы закрываете MessageBox, элемент управления TextBox получает фокус, но событие LostFocus непрерывно поднимается, и, поскольку условие else выполнено, у вас будет бесконечный цикл с MessageBoxes.

Я думаю, вы не должны использовать событие LostFocus, чтобы проверить значение TextBox и снова сфокусироваться. Рассматривали ли вы событие TextChanged?

Вы могли бы сделать что-то вроде этого:

private void TextTest_TextChanged(object sender, TextChangedEventArgs e) 
{ 
     Console.WriteLine("Text changed"); 

     /* your logic here */ 

     TextTest.Focus(); //it could be useless in this case! 
} 
+0

Где говорится «ваша логика здесь», мне нужно что-то менять? –

+1

Во-первых, это не приведет к исключению переполнения стека. Стек не увеличивается. Это просто навсегда. Далее, показанный код не указывает, как настройка фокуса приводит к тому, что фокус снова теряется, что должно произойти для бесконечного цикла. – Servy

+0

@Servy Да, вы правы. Я проверил неправильный код. Моя вина. Мой ответ обновлен. –

0

Следите, изменилось ли значение, так как вы в последний раз показал окно сообщения. Показывать только сообщение, если значение изменилось с момента последнего показа сообщения.

Я думаю так:

private string lastValue = null; 
private void TextBox_LostFocus(object sender, RoutedEventArgs e) //Lost Focus 
{ 
    bool valueChanged = (lastvalue != TextBox.Text); 
    lastValue = TextBox.Text; 
    if (string.IsNullOrEmpty(TextBox.Text)) 
     TextBox.Text = "Default Record"; 
    else if (Regex.IsMatch(TextBox.Text, @"^\d+$") == false && valueChanged) 
    { 
     MessageBox.Show("Illegal character in list.", "Warning!", MessageBoxButton.OK, MessageBoxImage.Warning); 
     TextBox.Focus(); 
    } 
} 
+0

Это работает, за исключением того, что он не устанавливает фокус обратно в 'textBox'. (Line 'TextBox.Focus();') –

0

Вы также можете посмотреть на использование замаскированный текстового поля, чтобы ограничить ввод в целых числах. Затем вы хотите выполнить проверку (проверку), когда пользователь нажимает «ok/next/submit» ... все, что закончит запись.

http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask%28v=vs.90%29.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

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