2009-02-04 7 views
4

Je crée un UserControl consistant en un TextBox et un ListView. Je souhaite que le focus du clavier reste sur le TextBox tant que le contrôle a le focus sur le clavier (les changements de sélection dans le ListView ne doivent pas supprimer le focus du clavier du TextBox).WPF Maintenir le focus du clavier

J'ai essayé attraper GotKeyboardFocus dans le ListView et le clavier qui passe le focus à l'aide de TextBoxKeyboard.Focus(), mais cela semble annuler toute opération de sélection dans le ListView. Le code ci-dessous montre le problème. Est-ce que quelqu'un sait comment réaliser cette fonctionnalité?

<Window x:Class="WpfApplication5.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <TextBox x:Name="TextBox1" /> 
     <ListView x:Name="ListBox1" Keyboard.GotKeyboardFocus="ListBox1_GotKeyboardFocus"> 
      <ListViewItem Content="Able" /> 
      <ListViewItem Content="Baker" /> 
      <ListViewItem Content="Charlie" /> 
     </ListView> 
    </StackPanel> 
</Window> 

using System.Windows; 
using System.Windows.Input; 

namespace WpfApplication5 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void ListBox1_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
     { 
      Keyboard.Focus(TextBox1); 
     } 
    } 
} 

Répondre

2

Il semble qu'il soit possible de changer de focus dans l'événement MouseUp. Je pense que si vous le faites trop tôt, comme dans l'événement GotKeyboardFocus, vous allez vous concentrer avant que la liste puisse gérer l'événement et sélectionner l'élément choisi.

<StackPanel> 
    <TextBox x:Name="TextBox1" /> 
    <ListView x:Name="ListBox1" MouseUp="ListBox1_MouseUp"> 
     <ListViewItem Content="Able" /> 
     <ListViewItem Content="Baker" /> 
     <ListViewItem Content="Charlie" /> 
    </ListView> 
</StackPanel> 

private void ListBox1_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    TextBox1.Focus(); 
} 
0

c'est un hack, mais si au lieu d'écouter l'événement GotKeyboardFocus, vous écoutez l'événement SelectionChanged sur la zone de liste?

+0

J'ai essayé ça. Dans ce cas, vous pouvez sélectionner dans le ListView, mais le focus est supprimé du clavier. –

3

Au lieu de cela, avez-vous envisagé simplement de capturer des séquences de touches et de les placer dans votre TextBox?

<Window PreviewKeyDown="Window_PreviewKeyDown" > 
    <Grid> 
     <TextBox x:Name="TextBox1" /> 
     <ListBox /> 
    </Grid> 
</Window> 

Puis dans le code-behind de votre fenêtre:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    TextBox1.Text += e.Key.ToString(); 
} 

Vous devez faire un travail supplémentaire pour quelque chose comme des caractères spéciaux (backspace, etc.), et, évidemment, un gestionnaire clé pour votre « Enter "ou" Post "opération, mais il vous donne la possibilité de tout type de forme libre alors que la fenêtre a le focus et de gérer correctement les frappes au besoin.

+0

Je pense que cela fonctionnerait. Je voudrais cependant que le curseur reste dans la TextBox. La fonctionnalité pour laquelle je suis en train de tourner est similaire à IntelliSense dans Visual Studio. –

0

Mettez Focusable = false sur votre ListView.

1

Si vous appelez la fenêtre de WPF d'un WinForm vous devez utiliser ceci:

System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(wpfWindow); 
wpfWindow.show(); 

du MSDN documentation.

Voilà comment j'ai résolu mon problème de clavier.

IceX

0

Ok, cela me rendait fou. Même si l'accent est mis sur UserControl chaque fois que vous perdez le focus, les touches de raccourci de commande ne fonctionnent toujours pas. Tout ce que je devais faire était de mettre la propriété Focusable à true, et voilà, ça marche!

Questions connexes