我已经将自定义Winform控件托管到WPF项目。当按下Tab或Shift + Tab键时,我已经处理了自定义控件的KeyDown事件以导航到下一个控件。
这是我用于处理Tab键的代码
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.Handled)
return;
if (this.AllowStandardTab)
{
Form form = this.FindForm();
if (form != null)
{
if (e.KeyData == (Keys.Tab | Keys.Shift))
{
form.SelectNextControl(this, false, true, false, true);
return;
}
else if (e.KeyData == Keys.Tab)
{
form.SelectNextControl(this, true, true, false, true);
return;
}
}
}
}
它可以在Winforms中正常工作,并导航到下一个控件。但是它在托管的wpf项目中不起作用。
如何在按住Tab键的同时检测到控件驻留在wpf中并将焦点移至下一个wpf窗口?
答案 0 :(得分:0)
默认情况下,也可以使用TAB键在WPF中工作。控件真的来自Winforms还是WPF都没有关系。这是我为您制作的简单示例。
<Window x:Class="StackPoC.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:StackPoC"
mc:Ignorable="d"
Loaded="Window_Loaded"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<TextBox Text="test x" />
<TextBox Text="test y" />
<TextBox Text="test z" />
<TextBox Text="test w" />
<Grid Name="containerForWinFormsControl" />
</StackPanel>
隐藏代码:
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Create the interop host control.
System.Windows.Forms.Integration.WindowsFormsHost host =
new System.Windows.Forms.Integration.WindowsFormsHost();
// Create the MaskedTextBox control.
MaskedTextBox mtbDate = new MaskedTextBox("00/00/0000");
// Assign the MaskedTextBox control as the host control's child.
host.Child = mtbDate;
// Add the interop host control to the Grid
// control's collection of child controls.
this.containerForWinFormsControl.Children.Add(host);
}
如果我正在考虑它在您的网站上无法正常工作的原因,我会想到一些事情。在进入Winforms控件之前,必须在某处处理TAB键按下事件。我也不知道控件是否可聚焦,但是您是否真的需要手动处理呢?框架确实会照顾我们。