更改文本框WPF的焦点列表

时间:2011-09-22 17:42:05

标签: c# wpf textbox focus

我有一个列表框,其中的项目是文本框。我需要设置一个键来将焦点更改为下一个文本框并开始编辑其内容。 我已经欺骗了一个解决方案来发送按键来实现我想要的,例如:

        ((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); 
            } 
        };

我使用此处http://inputsimulator.codeplex.com/中的库InputSimulator进行该方法。 我知道这不是正确的方法,所以我问我如何使用焦点方法实现相同的目标。我尝试使用以下代码,但我得到“超出范围”的错误,我不明白:

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 个答案:

答案 0 :(得分:1)

这是一个非常简短的答案。在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();
  }
}

因此,基本概念是您将在列表中找到当前文本框。然后你会以某种方式找到下一个(标签,名称等)并明确地集中它。当然,你必须根据你的确切需要进行调整。