3

I have a keyboard focus problem with Windows Forms application that hosts WPF UserControls. When I press tab, the navigation works well if there are only WPF controls in the UserControl. If I add a WindowsFormsHost hosted control to this WPF UserControl, the focus is not moving away from the WindowsFormsHosted control in WPF UserControl.

When the application is WPF application, the focus navigation works perfectly but when I add this WPF UserControl to Windows Forms application, pressing TAB doesn't work anymore.

It would be great to get some help with this.

Here is my code:

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>

Trainee
  • 41
  • 1
  • 4

2 Answers2

3

This is a bit tricky. Essentially, the hosted winform is borrowing the focus, but not returning it.

A look though this article might help: Gotchas For Working With Windows Forms/WPF Interop

Focus works differently for WPF and Windows Forms, and there were some rough edges around here that we were unable to fix.

According to MSDN

Keyboard interoperation relies on implementing the OnNoMoreTabStops method to handle TAB key and arrow key input that moves focus out of hosted elements

This SO question is a good place to look for workarounds.

Community
  • 1
  • 1
Mark Staff
  • 721
  • 3
  • 6
  • Thank you for your answer. These are good links here. Some of these links I already have checked, but I cannot figure out why focus is not going out from the hosted textbox while it does it when application is WPF application. – Trainee May 31 '11 at 09:43
0

Thank you for Mark Staff of the knowledge about focusing. The problem was really fixed with OnNoMoreTabStops method. I posted this problem to MSDN forum too and they found the solution for my problem. Here is the link to MSDN forums thread: http://social.msdn.microsoft.com/Forums/en-ZA/wpf/thread/054d8509-dd2d-4b60-9b0a-383b0147e2ac

Trainee
  • 41
  • 1
  • 4