3

我在托管 WPF 用户控件的 Windows 窗体应用程序中遇到键盘焦点问题。当我按 Tab 时,如果 UserControl 中只有 WPF 控件,则导航效果很好。如果我将 WindowsFormsHost 托管控件添加到此 WPF UserControl,则焦点不会从 WPF UserControl 中的 WindowsFormsHosted 控件移开。

当应用程序是 WPF 应用程序时,焦点导航工作正常,但是当我将此 WPF UserControl 添加到 Windows 窗体应用程序时,按 TAB 不再起作用。

在这方面获得一些帮助会很棒。

这是我的代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        ElementHost host = new ElementHost();
        host.Dock = DockStyle.Fill;
        host.Child = new SomeControls();
        this.Controls.Add(host);
    }
}

/// <summary>
/// Interaction logic for SomeControls.xaml
/// </summary>
public partial class SomeControls : UserControl
{
    public SomeControls()
    {
        InitializeComponent();
    }
}

<UserControl x:Class="TabAndHostTest.SomeControls"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
         xmlns:my="clr-namespace:TabAndHostTest" Width="450">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="124*" />
        <ColumnDefinition Width="388*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Label Grid.Row="0" Grid.Column="0" Content="value1" Height="28" HorizontalAlignment="Left" Name="value1" VerticalAlignment="Top" />
    <TextBox Grid.Row="0" Grid.Column="1" Height="23" HorizontalAlignment="Left" Name="textBox1" VerticalAlignment="Top" Width="257" />

    <Label Grid.Row="1" Content="value2" Height="28" HorizontalAlignment="Left" Name="value2" VerticalAlignment="Top" />
    <TextBox Grid.Row="1" Grid.Column="1" Height="23" HorizontalAlignment="Left" Name="textBox2" VerticalAlignment="Top" Width="257" />

    <Label Grid.Row="2" Grid.Column="0" Content="hostedvalue1" Height="28" HorizontalAlignment="Left" Name="hostedvalue1" VerticalAlignment="Top" />
    <WindowsFormsHost Grid.Column="1" Grid.Row="2" Height="23" HorizontalAlignment="Left" Name="windowsFormsHost1" VerticalAlignment="Top" Width="307">
        <forms:TextBox x:Name="formsTextbox1" Height="23" Width="150" />
    </WindowsFormsHost>

    <Label Grid.Row="3" Grid.Column="0" Content="hostedvalue2" Height="28" HorizontalAlignment="Left" Name="hostedvalue2" VerticalAlignment="Top" />
    <WindowsFormsHost Grid.Column="1" Grid.Row="3" Height="23" HorizontalAlignment="Left" Name="windowsFormsHost2" VerticalAlignment="Top" Width="307">
        <forms:TextBox x:Name="formsupdown1" Height="23" Width="150" />
    </WindowsFormsHost>
</Grid>

4

2 回答 2

3

这有点棘手。本质上,托管的 winform 是在借用焦点,而不是归还它。

看看这篇文章可能会有所帮助:Gotchas For Working With Windows Forms/WPF Interop

对于 WPF 和 Windows 窗体,Focus 的工作方式不同,这里有一些我们无法修复的粗糙边缘。

根据MSDN

键盘互操作依赖于实现OnNoMoreTabStops 方法来处理将焦点移出托管元素的 TAB 键和箭头键输入

这个 SO question是寻找解决方法的好地方。

于 2011-05-31T07:58:04.670 回答
0

感谢 Mark Staff 提供关于聚焦的知识。使用 OnNoMoreTabStops 方法确实解决了这个问题。我也将此问题发布到 MSDN 论坛,他们找到了解决我问题的方法。这是 MSDN 论坛主题的链接: http: //social.msdn.microsoft.com/Forums/en-ZA/wpf/thread/054d8509-dd2d-4b60-9b0a-383b0147e2ac

于 2011-06-03T04:18:44.913 回答