2011-10-26 4 views
2

J'ai des tabItems avec TextBox dans leurs en-têtes. J'utilise les événements LostFocus et MouseDoubleClick pour définir le texte à la zone de texte.WPF TabItem événement de focus perdu

<TabControl> 
       <TabItem Width="50"> 
        <TabItem.Header> 
         <TextBox Text="text" IsReadOnly="True" LostFocus="TextBox_LostFocus" MouseDoubleClick="TextBox_MouseDoubleClick"/> 
        </TabItem.Header> 
       </TabItem> 
</TabControl> 

    private void TextBox_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     TextBox text_box = sender as TextBox; 
     if (text_box == null) { return; } 

     text_box.IsReadOnly = false; 
     text_box.SelectAll(); 
    } 

    private void TextBox_LostFocus(object sender, RoutedEventArgs e) 
    { 
     TextBox text_box = sender as TextBox; 
     if (text_box == null) { return; } 

     text_box.IsReadOnly = true; 
    } 

événement LostFocus se produit si seulement vous cliquez sur la zone d'en-tête de TabItem en dehors de la zone de texte ou sur TabItem enother. Cliquer sur la zone de contenu de l'onglet ne déclenche pas l'événement de focus perdu. Comment faire pour que la zone de texte perdre le focus lorsque l'utilisateur clique sur une zone en dehors de la zone de texte?

?

Répondre

3

Pour Mise au point perdu, en d'autres termes pour obtenir une mise au contenu de l'onglet intérieur (cible):

  1. Focusable de la cible est définie comme vrai
  2. La cible devrait être touché testable. L'arrière-plan de la cible ne doit pas être nul.
  3. Ajouter un gestionnaire d'événements à l'événement PreviewMouseDown (REMARQUE: NOT MouseDown) pour réagir au clic de la souris. Si vous n'effectuez pas l'étape 3, votre application réagira uniquement à la touche TAB.

    <TabControl> 
        <TabItem Width="50"> 
         <TabItem.Header> 
          <TextBox 
           Text="text" IsReadOnly="True" 
           LostFocus="TextBox_LostFocus" 
           MouseDoubleClick="TextBox_MouseDoubleClick"/> 
         </TabItem.Header> 
         <Border Focusable="True" Background="Transparent" PreviewMouseDown="Border_PreviewMouseDown"/> 
        </TabItem> 
    </TabControl> 
    
    
    private void Border_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
        var uiElement = sender as UIElement; 
        if (uiElement != null) uiElement.Focus(); 
    } 
    
1

Pour perdre focus, un élément doit d'abord avoir focus. Peut-être une solution de rechange pourrait être de donner le focus de votre élément dans un endroit approprié lorsque vos éléments sont initialisés, par exemple:

changement

<TextBox Text="text" IsReadOnly="True" LostFocus="TextBox_LostFocus" MouseDoubleClick="TextBox_MouseDoubleClick"/> 

Pour

<TextBox x:Name="MyTextBox" Text="text" IsReadOnly="True" LostFocus="TextBox_LostFocus" MouseDoubleClick="TextBox_MouseDoubleClick"/> 

Et dans votre constructeur utilisez le FocusManager pour définir l'élément ciblé:

... 
FocusManager.SetFocusedElement(MyTextBox.Parent, MyTextBox); 
... 

Focus Overview sur MSDN est une bonne ressource, il est également important de faire la distinction entre la mise au point du clavier et la mise au point logique!