Использование GotFocus и TextChanged одновременно - Windows Phone
У меня есть AutoSuggestBox
который настроен обрабатывать события GotFocus & TextChanged одновременно. Я удалил текст из текстового поля в событии GotFocus. Теперь проблема в том, что когда я выбираю любое из предложений в AutoSuggestBox
после выбора вызывает обработчик события GotFocus и очищает выделенный текст от него.
Это MainPage.xaml
код с использованием AutoSuggestBox:
<AutoSuggestBox
x:Name="auto_text_from"
HorizontalAlignment="Left"
VerticalAlignment="Center"
PlaceholderText="Enter Source"
Height="auto"
Width="280"
GotFocus="auto_text_from_GotFocus"
TextChanged="AutoSuggestBox_TextChanged"/>
И это тот код, который я написал в MainPage.xaml.cs
:
private void auto_text_from_GotFocus(object sender, RoutedEventArgs e)
{
auto_text_from.Text = "";
}
string[] PreviouslyDefinedStringArray = new string[] {"Alwar","Ajmer","Bharatpur","Bhilwara",
"Banswada","Jaipur","Jodhpur","Kota","Udaipur"};
private void AutoSuggestBox_TextChanged(AutoSuggestBox sender,AutoSuggestBoxTextChangedEventArgs args)
{
List<string> myList = new List<string>();
foreach (string myString in PreviouslyDefinedStringArray)
{
if (myString.ToLower().Contains(sender.Text.ToLower()) == true)
{
myList.Add(myString);
}
}
sender.ItemsSource = myList;
}
Я хочу использовать оба обработчика событий. GotFocus
для очистки данных текстового поля, и TextChanged
для показа предложений написания текста в нем.
Пожалуйста, предложите мне любой способ сделать то же самое.
Заранее спасибо:)
2 ответа
Если AutoSuggestBox
есть событие для обработки выбора предлагаемого слова, например "SuggestionChosen
"Возможное решение - использование закрытого флага, управляемого между различными обработчиками.
Установите приватное поле:
private bool _isSelectingSuggestion;
Ссылка на метод-обработчик, как OnSuggestionChosen
на мероприятие SuggestionChosen
и реализовать это так:
private void OnSuggestionChosen(object sender, RoutedEventArgs e)
{
_isSelectingSuggestion = true;
}
Затем в GotFocus установите флажок так:
private void auto_text_from_GotFocus(object sender, RoutedEventArgs e)
{
if (_isSelectingSuggestion)
e.Handled = true;
else
auto_text_from.Text = "";
_isSelectingSuggestion = false;
}
Очевидно, это работает, только если SuggestionChosen
поднимается раньше GotFocus
: когда GotFocus
начинается, это продолжается как: "хорошо, у меня есть фокус, потому что предложение было выбрано только минуту назад? Если это правда, я не должен очищать свой текст! В противном случае, я очистю его!".
Дайте мне знать, что эта работа для вас!
@MK87: Да, это работало с небольшими изменениями!:)
private bool _isSelectingSuggestion;
private void OnSuggestionChosen(AutoSuggestBox sender, AutoSuggestBoxSuggestionChosenEventArgs args)
{
_isSelectingSuggestion = true;
}
private void auto_text_from_GotFocus(object sender, RoutedEventArgs e)
{
if (!_isSelectingSuggestion)
auto_text_from.Text = "";
_isSelectingSuggestion = false;
}
Мне пришлось удалить эту строку:
e.Handled == true;
как это давало мне ошибку как RoutedEventArgs does not contain a definition for 'Handled'
,
Спасибо за вашу помощь:):)