2013-06-10 2 views
0

У меня есть два текстовых поля в WPF. названный txt1 и txt2.Использование события в WPF

В LostFocus из txt1 я пишу

If txt1.Text is nothing then 
    txt1.Focus 
End If 

В случае LostFocus из txt2 я пишу

If txt2.Text is nothing then 
    txt2.Focus 
End If 

Теперь, если txt1 и txt2 являются пустыми и пользователь нажимает клавишу TAB в txt1 в проблема возникает. Программа идет в бесконечном цикле. Я имею в виду, что курсор приходит в txt1 и переходит в txt2 бесконечное время. Я знаю, что это нормальное поведение в соответствии с моим кодом.

Так что я хочу иметь проверочное событие, чтобы избежать таких проблем, как описано выше. Но я не могу найти его в WPF. Итак, какое событие я должен использовать?

+0

Вместо установки фокуса обратно в TextBox, который теряет фокус, почему не очертить TextBox в красном показывая, что поле нуждается в данных или отобразить MessageBox? Или почему не выполняется проверка до тех пор, пока не будет достигнут конец формы, и пользователь нажмет кнопку отправки? – Ripster

ответ

1

Я не кодер VB, поэтому не могу написать для вас точный код, но вот что вам следует делать. Добавить обработчик событий для события PreviewLostKeyboardFocus. внутри обработчика событий e.Handled to true, если текст пуст. Пример кода C#. У меня есть общий обработчик.

private void TextBox_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
{ 
    if (string.IsNullOrEmpty((sender as TextBox).Text)) 
    { 
     e.Handled = true; 
    } 
} 
+0

А как насчет потери фокуса из-за мыши? – Vishal

+1

@ Вишал это не то, о чем вы говорили раньше. Вы даже попробовали код, который я предложил? Этот код добавит фокус обратно в текстовое поле даже при использовании мыши. – Nishant

+0

Прошу прощения из-за моего сердца за игнорирование вашего ответа. Это идеальный ответ. – Vishal

0

Лучшее решение могло бы быть, чтобы позволить пользователю перемещаться от пустого/нулевого текстового поля, но либо вернуть текст к исходному значению (если есть один) или предоставить ошибку проверки. Предоставление ошибок проверки относительно легко с помощью IDataErrorInfo.

Как пользователь программного обеспечения, меня раздражает, когда приложение не позволяет мне перейти от поля.

Сброс Значение подход

Смотрите эту StackOverflow appraoch о том, как сохранить и получить предыдущее значение. В событии LostFocus вы можете установить переменную-член обратно в _oldValue, если текущее значение недействительно. determine a textbox's previous value in its lost focused event? WPF

Validation подход

Эти две даты хранятся в модели или класса вид модели. В этом классе реализуют IDataErrorInfo (http://msdn.microsoft.com/en-us/library/system.componentmodel.idataerrorinfo(v=vs.95).aspx). Затем в вашем xaml вы можете показать ошибки проверки.

//This is your model/viewmodel validation logic 
public string this[string columnName] 
{ 
    get 
    { 
     string result = null; 
     if (columnName == "FirstName") 
     { 
      if (string.IsNullOrEmpty(FirstName)) 
       result = "Please enter a First Name"; 
     } 
     if (columnName == "LastName") 
     { 
      if (string.IsNullOrEmpty(LastName)) 
       result = "Please enter a Last Name"; 
     } 
     if (columnName == "Age") 
     { 
      if (Age < = 0 || Age >= 99) 
       result = "Please enter a valid age"; 
     } 
     return result; 
    } 
} 

//Here is a sample of a xaml text block 
<textbox x:Name="tbFirstName" Grid.Row="0" Grid.Column="1" Validation.Error="Validation_Error" Text="{Binding UpdateSourceTrigger=LostFocus, Path=FirstName, ValidatesOnDataErrors=true, NotifyOnValidationError=true}" /> 

Вы также можете посмотреть на этих других StackOverflow posts- What is IDataErrorInfo and how does it work with WPF? IDataErrorInfo notification

+0

Я нахожусь в начальной части моего бухгалтерского проекта. Там мне нужно два дата от пользователя. Дата начала финансового года и дата окончания финансового года, и оба они необходимы. Итак, что вы предлагаете в этом случае? – Vishal

+0

Не активировать следующие действия, пока эти два поля не пройдут проверку (не являются нулевыми). – Darlene

+0

спасибо за предложение. Но проблема была решена Нишантом. – Vishal

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