Использование 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',

Спасибо за вашу помощь:):)

Другие вопросы по тегам