Найти активное текстовое поле WPF

#c# #wpf

#c# #wpf

Вопрос:

Я создаю страницу входа для устройства киоска, используя WPF. На странице и клавиатуре есть 3 текстовых поля (созданных с помощью кнопок). Для выполнения действия, когда мы нажимаем кнопку на клавиатуре, мы хотим отобразить текст в соответствующем текстовом поле.

Необходимо: Как найти текстовое поле, на котором в данный момент сосредоточено внимание.

код, использующий:

     void buttonElement_Click(object sender, RoutedEventArgs e)
    {
        // create variable for holding string
        String sendString = "";

        try
        {
            // stop all event handling
            e.Handled = true;
            Button btn = ((Button)sender);

            // set sendstring to key
            if (btn.Content.ToString().Length == 1 amp;amp; btn.CommandParameter.ToString() != btn.Content.ToString())
            {
                sendString = btn.Content.ToString();
            }
            else
            {
                sendString = btn.CommandParameter.ToString();
            }

            // sendString = ((Button)sender).CommandParameter.ToString();
            int position = txtAuto.SelectionStart;

            // if something to send
            if (!String.IsNullOrEmpty(sendString))
            {
                // if sending a string
                if (sendString.Length > 1)
                {
                    switch (sendString)
                    {
                        case "Del":
                            if (position != txtAuto.Text.Length)
                            {
                                txtAuto.Text = txtAuto.Text.Remove(position, 1);
                                txtAuto.SelectionStart = position;
                            }
                            break;

                        case "BACKSPACE":
                            if (position != 0)
                            {
                                txtAuto.Text = txtAuto.Text.Remove(position - 1, 1);
                                txtAuto.SelectionStart = position;
                            }
                            break;

                        case "Clear":
                            txtAuto.Text = string.Empty;
                            break;
                        case "ENTER":
                            popup.IsOpen = false;
                            // lbSuggestion.ItemsSource = null;

                            this.FetchSearchResult(txtAuto.Text.Trim());
                            if (lbResult.Items.Count != 0)
                            {
                                lbResult.ScrollIntoView(lbResult.Items[0]);
                            }

                            break;
                    }
                }
                else
                {
                    txtAuto.Text = txtAuto.Text.Insert(txtAuto.SelectionStart, sendString);
                    txtAuto.SelectionStart = position   1;
                }

                // set keyboard focus
                System.Windows.Input.Keyboard.Focus(this.txtAuto);
                // set normal focus
                this.txtAuto.Focus();
            }
        }
        catch (Exception)
        {
            // do nothing - not important for now
            Console.WriteLine("Could not send key press: {0}", sendString);
        }
    }
  

Этот код отлично работает для одного текстового поля, как заставить его работать для других текстовых полей.

Ответ №1:

Обычно фокус теряется при нажатии кнопки. Таким образом, вы можете «сохранить» последнее сфокусированное текстовое поле в переменной класса, если текстовое поле теряет фокус.

 private TextBox _currentTextbox;

private void TextBoxLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    _currentTextbox = e.Source as TextBox;
}
  

прикрепите этот обработчик ко всем текстовым полям и используйте _currentTextbox в своей функции.

Смотрите больше на http://msdn.microsoft.com/en-us/library/aa969768.aspx

Ответ №2:

Необходимо: Как найти текстовое поле, на котором в данный момент сосредоточено внимание.

Вы можете использовать FocusManager.GetFocusedElement метод.

Ответ №3:

Когда вы нажимаете кнопку, кнопка получает фокус, а текстовое поле теряет его. Итак, одним из подходов было бы подписаться на LostFocus события всех текстовых полей и запомнить, какое из них потеряло фокус. Тот, который потерял фокус последним, — это тот, который потерял фокус из-за нажатия кнопки и, следовательно, был тем, у которого был фокус до щелчка.