2009-03-13 6 views

Antwort

27

Ich habe diese Lösung für eine RichTextBox verwendet, aber ich nehme an, dass es auch für eine Standardtextbox funktioniert. Grundsätzlich müssen Sie das LostFocus-Ereignis behandeln und als behandelt markieren.

Die TextBox erkennt nicht, dass sie den Fokus verloren hat und zeigt weiterhin die hervorgehobene Auswahl an.

Ich verwende in diesem Fall keine Datenbindung, daher ist es möglich, dass dies die Zwei-Wege-Bindung durcheinander bringt. Möglicherweise müssen Sie die Bindung in Ihrem LostFocus-Ereignishandler erzwingen. Etwas wie folgt aus:

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

Das hat funktioniert! Vielen Dank! –

+0

+1 Schöne Lösung - half mir beim Erstellen einer Suchfunktion ... Thx – reSPAWNed

+1

Dies funktioniert meistens, aber bricht Scrollen auf nicht fokussierten RichTextBoxen mit Auswahlen in ihnen - die Auswahl Highlight bewegt sich nicht mit dem Text. – Cameron

10

Eine andere Möglichkeit ist, einen separaten Fokusbereich in XAML definieren die Auswahl in der ersten TextBox zu halten.

<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

Es gibt eine gute visuelle Demonstration davon unter http://wpfhacks.blogspot.com/2009/06/correct-way-keep-selection-in-textbox.html – mtlynch

+0

Diese Lösung ist mehr zu meiner Bequemlichkeit. – tharibo

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

    } 
}