2009-03-13 9 views

Répondre

27

J'ai utilisé cette solution pour un RichTextBox, mais je suppose qu'il fonctionnera également pour une zone de texte standard. Fondamentalement, vous devez gérer l'événement LostFocus et le marquer comme manipulé. Le TextBox ne réalisera pas qu'il a perdu le focus et affichera toujours la sélection en surbrillance.

Je n'utilise pas de liaison de données dans ce cas, il est donc possible que cela perturbe la liaison bidirectionnelle. Vous devrez peut-être forcer la liaison dans votre gestionnaire d'événements LostFocus. Quelque chose comme ceci:

 Binding binding = BindingOperations.GetBinding(this, TextProperty); 
    if (binding.UpdateSourceTrigger == UpdateSourceTrigger.Default || 
     binding.UpdateSourceTrigger == UpdateSourceTrigger.LostFocus) 
    { 
     BindingOperations.GetBindingExpression(this, TextProperty).UpdateSource(); 
    } 
+0

Cela a fonctionné! Merci! –

+0

+1 Belle solution - m'a aidé à créer une fonction de recherche ... Thx – reSPAWNed

+1

Cela fonctionne principalement, mais ne fonctionne pas avec les sélections RichTextBox non ciblées - la sélection ne bouge pas avec le texte. – Cameron

10

Une autre option est de définir un champ de mise au point séparée en XAML pour maintenir la sélection dans la première zone de texte.

<Grid> 
    <Grid.RowDefinitions> 
    <RowDefinition/> 
    <RowDefinition/> 
    </Grid.RowDefinitions> 

    <TextBox Grid.Row="0" Text="Text that does not loose selection."/> 
    <StackPanel Grid.Row="1" FocusManager.IsFocusScope="True"> 
    <TextBox Text="Some more text here." /> 
    <Button Content="Run" /> 
    <Button Content="Review" /> 
    </StackPanel> 
</Grid> 
+1

Il y a une bonne démonstration visuelle de ceci à http://wpfhacks.blogspot.com/2009/06/correct-way-keep-selection-in-textbox.html – mtlynch

+0

Cette solution est plus à ma convenance. – tharibo

2
public class CustomRichTextBox : RichTextBox 
{ 
    protected override void OnLostFocus(RoutedEventArgs e) 
    { 

    } 
} 
Questions connexes