2012-12-07 3 views
0

J'ai un dialogue avec peu de contrôles. Il y a un TextBox nommé txtControl et deux ButtonsAccepter et Annuler. Je veux que, une fois l'accent est en txtControl, la mise au point ne doit pas disparaître, jusqu'à ce que je clique sur Accepter ou Annuler le bouton.Comment restreindre le focus dans la zone de texte

Si je tente de cliquer sur tout autre contrôle sans cliquer sur Encaisser ou bouton Annuler, puis se concentrer devrait reste dans txtControl. Aussi, je ne veux pas désactiver ou gai les autres contrôles.

Répondre

0

Je voudrais créer une propriété mitoyenne qui avait l'air pour la zone de texte perd le focus keyboad et juste forcer le focus dans la zone de texte à nouveau.

La propriété attachée serait quelque chose comme ceci.

public class TextBoxExtras : DependencyObject 
    { 
     public static bool GetRetainsFocus(DependencyObject obj) 
     { 
      return (bool)obj.GetValue(RetainsFocusProperty); 
     } 

     public static void SetRetainsFocus(DependencyObject obj, bool value) 
     { 
      obj.SetValue(RetainsFocusProperty, value); 
     } 

     public static readonly DependencyProperty RetainsFocusProperty = 
      DependencyProperty.RegisterAttached("RetainsFocus", typeof(bool), typeof(TextBoxExtras), new PropertyMetadata(false, new PropertyChangedCallback((s, e) => 
       { 
        TextBox textBox = s as TextBox; 
        if (textBox != null) 
        { 
         if (!(bool)e.NewValue && (bool)e.OldValue) 
          textBox.LostKeyboardFocus -= textBox_LostKeyboardFocus; 
         if ((bool)e.NewValue) 
         { 
          textBox.LostKeyboardFocus += textBox_LostKeyboardFocus; 
          textBox.Unloaded += textBox_Unloaded; 
         } 
        } 
       }))); 

     static void textBox_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
     { 
      TextBox textBox = sender as TextBox; 
      if (textBox != null) 
       if (textBox.Focusable) 
        textBox.Focus(); 
     } 

     static void textBox_Unloaded(object sender, RoutedEventArgs e) 
     { 
      TextBox textBox = sender as TextBox; 
      if (textBox != null) 
      { 
       textBox.LostKeyboardFocus -= textBox_LostKeyboardFocus; 
       textBox.Unloaded -= textBox_Unloaded; 
      } 
     } 
    } 

et l'utiliser dans XAML comme celui-ci, la première zone de texte est celui qui « rester concentré »

<Window x:Class="WpfApplication4.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication4" 
     Background="Black" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TextBox local:TextBoxExtras.RetainsFocus="True" Margin="10,10,387,283"/>   
     <TextBox HorizontalAlignment="Left" Height="23" Margin="10,37,0,260" Width="120" /> 
     <Button Content="Accept" HorizontalAlignment="Left" Margin="10,81,0,0" VerticalAlignment="Top" Width="75" /> 
    </Grid> 
</Window> 
0

Vous pouvez gérer OnPreviewMouseDown dans la racine, chaque fois que le focus est sur txtControl, et que la souris n'est pas sur txtControl, Accepter ou Annuler;

void mainWindow_previewMouseDown(object sender, MouseEventArg e) 
{ 

    if (txtControl.IsFocusWithin)   
    { 
      if (txtControl.IsMouseOver == false || 
      accept.IsMouseOver ==false || 
      cancel.IsMouseOver ==false) 
      { 
       e.Handle = true; 
      } 
     } 
} 

et vous pouvez également hadle PreviewKeyDown pour voir si Tab est pressée ou non.

0

Ce type de restriction n'est pas une bonne idée.

Comment votre application sera-t-elle utilisée par quelqu'un qui ne peut pas utiliser de souris et utilise la touche de tabulation pour passer d'une commande à l'autre?

+2

Cela devrait être un commentaire au lieu d'une réponse. N'est-ce pas? –

0

Vous pouvez gérer le PreviewLostKeyboardFocus au niveau racine.

En XAML

<Window ... PreviewLostKeyboardFocus="Win_PreviewLostKeyboardFocus"> 

En C#

private void Win_PreviewLostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e) 
    { 
     // change focus behavior only when txtControl 
          // is the element losing focus 
     if (e.OldFocus != txtControl) 
      return; 

          // if new element with focus is not Accept and is not Cancel, then disable the focus change 
     if (e.NewFocus != Accept && e.NewFocus != Cancel) 
      e.Handled = true; 
    } 
+0

Cela n'empêche pas l'utilisateur de régler la mise au point sur les boutons, puis de passer immédiatement à autre chose. "Comment peuvent-ils faire ça??!!" Je vous entends demander ... avec la touche Tab. – slugster

+0

Je suis d'accord. D'un autre côté, la question concerne le cas où la zone de texte est focalisée. Si la zone de texte est mise au point et que l'utilisateur appuie sur la touche de tabulation, la mise au point sur la zone de texte est perdue uniquement si le nouvel élément ciblé est soit Accepter soit Annuler (en fonction de TabIndex). – Klaus78

Questions connexes