2011-09-22 134 views
0

我有一个列表框,其中的项目是文本框。我需要设置一个键将焦点更改为下一个文本框并开始编辑其内容。 我已经被骗送液击键达到我想要的东西,例如:更改文本框的焦点列表WPF

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

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

所以基本概念是,您将在列表中找到当前文本框。然后你会以某种方式找到下一个(标签,名称等)并明确地关注它。当然,你将不得不调整取决于你的确切需要。

+0

也许我并没有深入了解为什么我的解决方案是错误的,你的工作,所以我打算使用它,谢谢。 – mjsr

+0

与此相同,我不知道如何将重点设置为Windows Load时的第一项。 (ListBox1.Items [0]作为TextBox).Focus()不立即开始编辑。我需要再次按下Tab键。你能告诉我如何做到这一点?请注意,每个TextBox都是动态创建的。 – mjsr

+0

@voodoomsr:我不认为你的例子是错的,它只是以一种不完全稳定的方式来做。如果您想在窗口加载时关注文本框,请尝试在Window.Loaded事件或类似事件中执行此操作。对不起,但我不能在这里提供更多细节。 –