我尝试在用户输入上一个文本框的数据后,将功能设置为下一个文本框。例如,一旦他们填写公司名称,我希望能够点击 Tab 并将焦点设置在下一个文本框"作业名称"。这是在代码或表单属性中完成的吗?
以下是我的一些代码。我不确定如何在KeyEventsArgs
中嵌套KeyPress
,这就是我看到其他人使用private void textBox1_TextChanged(object sender, EventArgs e)
{
CompanyName = textBox1.Text;
textBox1.AcceptsTab = true;
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
JobName = textBox2.Text;
textBox2.AcceptsTab = true;
}
函数将焦点设置到下一个文本框的方式。
{{1}}
答案 0 :(得分:1)
根据您提出的问题和提供的代码示例,您的方法与所需功能之间似乎存在某种脱节。
如果您希望用户能够使用 Tab键以便在窗口中的元素之间切换键盘焦点,则只需提供 TabIndex 属性在每个TextBox控件上。没有必要使用TextChanged事件来实现这一点,为了简单起见,它可以在XAML中完全完成。
从我如何解释您的问题,您的下一个后续可能是:
如何在应用程序时最初将焦点放在控件上 开始?
为了解决这个问题,我们提供了几种替代方案,其中最简单的方法是以FocusManager的形式提供,我再次说明了XAML的用法。
为方便起见,这里是一个仅实现了TabIndex和FocusManager的XAML实现:
<Window x:Class="tab_navigation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:tab_navigation"
mc:Ignorable="d"
Title="MainWindow" ResizeMode="NoResize" SizeToContent="WidthAndHeight" FocusManager.FocusedElement="{Binding ElementName=TbxCompanyName}">
<Grid Margin="10">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical" Margin="0,0,0,10">
<Label Content="Company Name:" Target="{Binding ElementName=TbxCompanyName}" />
<TextBox Name="TbxCompanyName" TabIndex="0" Width="160" HorizontalAlignment="Left"/>
</StackPanel>
<StackPanel Orientation="Vertical">
<Label Content="Job Description:" Target="{Binding ElementName=TbxJobDescription}"/>
<TextBox Name="TbxJobDescription" TabIndex="1" Width="160" HorizontalAlignment="Left"/>
</StackPanel>
</StackPanel>
</Grid>
如果您需要任何进一步的帮助,请给我一个喊叫,虽然我强烈建议您先查看一些MSDN资源,特别是有关Focus
的资源。更新:在回应有关实施解决方案的评论时, WPF具有与WinForms不同的设计和最佳实践。 我会强烈表明您停止使用Forms而不是使用Window或UserControl派生类代替WPF项目中的Form,除非有非常非常好的理由这样做。如果你继续在你的WPF项目中使用一个Form,你确实需要在那个窗体中实现你自己的键盘导航逻辑,并弥补你在尝试获取一个Form表现时不可避免地遇到的各种其他差距。通常接受的方式。 我将使用Window或UserControl元素,在WPF中使用客观更好,更合适的方法向您展示如何实现您的请求。还有一个完整的解决方案zip downloadable here。
WPF在设计上比WinForms更加模块化,默认情况下很好地区分了关注领域,尽管大多数开发人员在此基础上实现了设计模式; MVVM是WPF的当前宠儿,并且确实为项目增加了很多价值,虽然它超出了你的问题的范围,所以我将基于如何最大限度地实现请求来解决问题本身基本形式。请注意,虽然这不是完全理想的解决方案,但我强烈建议您学习并实现WPF的MVVM模式,如果您还不熟悉它。
通过该免责声明,而不是在WPF中使用表单,对于我们创建一个派生自 Window 的类更有用。 WPF中更常见的一种情况是,您希望拥有一个窗口,其内容在不同视图之间变化,而不是说创建多个窗口,尽管这也超出了问题的范围,并依赖于读取Binding和MVVM。我将向您展示一种快速简便的方法来获取您所要求的功能,我只是想在此处迭代这不是常态几乎所有的时间。
要制作有效的解决方案,请对项目执行以下操作:
<Grid></Grid>
标记,然后从XAML I&#39复制/粘贴此摘录已经从上面提供了他们的位置: <Grid Margin="10">
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Vertical" Margin="0,0,0,10">
<Label Content="Company Name:" Target="{Binding ElementName=TbxCompanyName}" />
<TextBox Name="TbxCompanyName" TabIndex="0" Width="160" HorizontalAlignment="Left"/>
</StackPanel>
<StackPanel Orientation="Vertical">
<Label Content="Job Description:" Target="{Binding ElementName=TbxJobDescription}"/>
<TextBox Name="TbxJobDescription" TabIndex="1" Width="160" HorizontalAlignment="Left"/>
</StackPanel>
</StackPanel>
</Grid>
FocusManager.FocusedElement="{Binding ElementName=TbxCompanyName}
添加到 CustomerInformationEntry.xaml 中的窗口元素。<Button Name="BtnOpenCustomerInformationEntry" Content="Enter Customer Information" Click="OpenCustomerInformationEntry"/>
。在我的情况下,我会在我的对象中添加按钮,但如果您已经创建了初始窗口,可以将它放在任何您喜欢的位置。 private void OpenCustomerInformationEntry(object sender, RoutedEventArgs e)
{
CustomerInformationEntry myWindow = new CustomerInformationEntry();
myWindow.Show();
}
就是这样,您现在在MainWindow.xaml中有一个按钮,单击该按钮时使用MainWindow.xaml.cs中定义的OpenCustomerInformationEntry方法,该方法又生成CustomerInformationEntry窗口的一个实例并显示它。 / p>
如果您仍然坚持使用表单方法,则可以使用WindowsFormsHost来完成此操作,其使用情况为discussed here。
最诚挚的问候, JC