#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
события всех текстовых полей и запомнить, какое из них потеряло фокус. Тот, который потерял фокус последним, — это тот, который потерял фокус из-за нажатия кнопки и, следовательно, был тем, у которого был фокус до щелчка.