Проблема с фокусировкой клавиатуры в размещенном в ElementHost представлении WPF с размещенными элементами управления WindowsFormsHost - PullRequest
2 голосов
/ 31 мая 2011

У меня проблема с фокусировкой клавиатуры в приложении Windows Forms, на котором размещены пользовательские элементы управления WPF.Когда я нажимаю вкладку, навигация работает хорошо, если в UserControl есть только элементы управления WPF.Если я добавлю размещенный элемент управления WindowsFormsHost к этому пользовательскому элементу управления WPF, фокус не отойдет от элемента управления WindowsFormsHosted в пользовательском элементе управления WPF.

Когда приложение является приложением WPF, навигация по фокусу работает отлично, но когда я добавляю этот WPF UserControl в приложение Windows Forms, нажатие клавиши 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>

Ответы [ 2 ]

3 голосов
/ 31 мая 2011

Это немного сложно. По сути, размещенная winform занимает фокус, но не возвращает его.

Обратите внимание, что эта статья может помочь: Скорее всего, для работы с Windows Forms / WPF Interop

Фокус работает по-разному для WPF и Windows Forms, и были некоторые острые углы здесь, что мы были невозможно исправить.

Согласно MSDN

Взаимодействие клавиатуры зависит от реализация OnNoMoreTabStops метод обработки клавиши TAB и клавиши со стрелкой вход, который перемещает фокус из размещенного элементы

Этот вопрос SO является хорошим местом для поиска обходных путей.

0 голосов
/ 03 июня 2011

Спасибо за Марк Персонал за знания о фокусировке. Проблема была действительно исправлена ​​с помощью метода OnNoMoreTabStops. Я также опубликовал эту проблему на форуме MSDN, и они нашли решение для моей проблемы. Вот ссылка на ветку форумов MSDN: http://social.msdn.microsoft.com/Forums/en-ZA/wpf/thread/054d8509-dd2d-4b60-9b0a-383b0147e2ac

...