我有一个列表框,其中的项目是文本框。我需要设置一个键来将焦点更改为下一个文本框并开始编辑其内容。 我已经欺骗了一个解决方案来发送按键来实现我想要的,例如:
((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();
}
}
因此,基本概念是您将在列表中找到当前文本框。然后你会以某种方式找到下一个(标签,名称等)并明确地集中它。当然,你必须根据你的确切需要进行调整。