Изменить список фокусировки текстовых полей WPF - PullRequest
0 голосов
/ 22 сентября 2011

У меня есть список, в котором элементы являются текстовыми полями.Мне нужно установить ключ, чтобы изменить фокус на следующее текстовое поле и начать редактирование его содержимого.Я обманул решение, отправляющее нажатия клавиш для достижения того, чего я хочу, например:

        ((TextBox)listBox1.Items[0]).KeyDown += (object x, KeyEventArgs y) => { 
            if (y.Key == Key.Enter) { 
                InputSimulator.SimulateKeyDown(VirtualKeyCode.TAB); 
                InputSimulator.SimulateKeyPress(VirtualKeyCode.DOWN); 
                InputSimulator.SimulateKeyDown(VirtualKeyCode.TAB); 
            } 
        };

Я использую библиотеку InputSimulator, найденную здесь http://inputsimulator.codeplex.com/ для этого подхода.Я знаю, что это не правильный способ сделать это, поэтому я спрашиваю, как я могу добиться того же, используя методы фокусировки.Я пытаюсь использовать следующий код, но получаю ошибку «вне диапазона», которую не понимаю:

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < 3; i++)
        {
            listBox1.Items.Add(new TextBox() { 
                TabIndex=i
            });

        }
        for (int i = 0; i < listBox1.Items.Count-1; i++)
        {
            ((TextBox)listBox1.Items[i]).KeyDown += (object x, KeyEventArgs y) => { if (y.Key == Key.Tab) { Keyboard.Focus((TextBox)listBox1.Items[i+1]); } };
        }
        ((TextBox)listBox1.Items[listBox1.Items.Count - 1]).KeyDown += (object x, KeyEventArgs y) => { if (y.Key == Key.Tab) { Keyboard.Focus((TextBox)listBox1.Items[0]); }};

    }

1 Ответ

1 голос
/ 22 сентября 2011

Вот очень короткий ответ для вас.В XAML вы можете использовать стиль, чтобы определить общий обработчик для ваших списков ...

<Window x:Class="Interface.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

  <Window.Resources>
    <Style TargetType="{x:Type TextBox}">
      <EventSetter Event="KeyDown" Handler="TextBox_KeyDown"/>
      <Setter Property="Width" Value="100"/>
    </Style>
  </Window.Resources>


  <ListBox Name="lstBoxList">
    <TextBox>ABC</TextBox>
    <TextBox>DEF</TextBox>
    <TextBox>GHI</TextBox>
  </ListBox>

</Window>

Таким образом, вы можете увидеть все текстовые поля в списке.Фактический код обработчика будет выглядеть следующим образом ...

private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
  if (e.Key == Key.Enter)
  {
    // Locate current item.
    int current = lstBoxList.Items.IndexOf(sender);

    // Find the next item, or give up if we are at the end.
    int next = current + 1;
    if (next > lstBoxList.Items.Count - 1) { return; }

    // Focus the item.
    (lstBoxList.Items[next] as TextBox).Focus();
  }
}

Таким образом, основная концепция заключается в том, что вы найдете текущее текстовое поле в списке.Затем вы как-то найдете следующий (теги, имена и т. Д.) И сфокусируете его явно.Конечно, вам придется настроить в зависимости от ваших потребностей.

...