3

WPF UserControls をホストする Windows フォーム アプリケーションでキーボード フォーカスの問題があります。タブを押すと、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はフォーカスを借用していますが、それを返していません。

この記事が役立つかもしれませんが、一見:Windowsフォーム/WPF相互運用機能を操作するためのヒント

フォーカスの動作はWPFフォームとWindowsフォームで異なり、このあたりには修正できなかったラフなエッジがいくつかありました。

MSDNによると

キーボードの相互運用は、OnNoMoreTabStops メソッドを実装して、ホストされている要素からフォーカスを移動するTABキーと矢印キーの入力を処理することに依存しています。

このSOの質問は、回避策を探すのに適した場所です。

于 2011-05-31T07:58:04.670 に答える
0

ピント合わせに詳しいマークスタッフさん、ありがとうございます。問題は OnNoMoreTabStops メソッドで本当に修正されました。この問題を MSDN フォーラムにも投稿したところ、問題の解決策が見つかりました。MSDN フォーラム スレッドへのリンクは次のとおりです

于 2011-06-03T04:18:44.913 に答える