在WPF中托管Winform控件时,如何使用Tab键将焦点移至下一个控件?

时间:2018-10-05 12:07:50

标签: c# wpf winforms

我已经将自定义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窗口?

1 个答案:

答案 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键按下事件。我也不知道控件是否可聚焦,但是您是否真的需要手动处理呢?框架确实会照顾我们。