Das Problem
Bei Bildschirmmasken möchte man gerne das Standardverhalten zurück, dass der Text beim Durchwandern der Eingabezeilen per TAB selektiert wird. WPF setzt per Default lediglich den Cursor an die erste Zeile.
Beim Suchen im Netz stößt man meist auf die Formel
protected override void OnStartup(StartupEventArgs e) { EventManager.RegisterClassHandler(typeof(TextBox) , TextBox.GotFocusEvent , new RoutedEventHandler(TextBox_GotFocus)); base.OnStartup(e); } void TextBox_GotFocus(object sender, RoutedEventArgs e) { var tb = sender as TextBox; if (tb == null) return; tb.Focus(); tb.SelectAll(); }
Das funktioniert auch auf Anhieb – nur leider eben global und somit überall.
Als Behavior
Eher im Sinne der WPF wäre ein Behavior für Textboxen. Das liest sich analog
public class SelectTextOnFocus : Behavior<TextBox> { protected override void OnAttached() { base.OnAttached(); AssociatedObject.GotFocus += OnFocus; } protected override void OnDetaching() { AssociatedObject.GotFocus -= OnFocus; base.OnDetaching(); } void OnFocus(object sender, RoutedEventArgs e) { AssociatedObject.SelectAll(); } }
Der Vorteil liegt auf der Hand: man kann die Verhaltensweise auf diejenigen Textboxen einschränken, bei denen man dies auch haben möchte.
Der Nachteil ist, dass Behaviors Teil des Blend SDKs sind und waren. Nun ist Blend 4 als Teil des ursprünglichen Expression Blend in Visual Studio aufgegangen. Welches aber ist der Nachfolger?
Es gibt verschiedene inoffizielle, aber auch von Microsoft herausgegebene NuGet-Pakete. Expression.Blend.SDK scheint das kompletteste zu sein, mit verschiedenen Plattformen und .NET Versionen. Aber auch das Paket System.Windows.Interactivity v4.0 for WPF versieht klaglos seinen Dienst.
Der XAML-Code der zugehörigen View liest sich wie folgt:
<Window x:Class="SelectOnFocus.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:local="clr-namespace:SelectOnFocus" Title="Eingabe" Width="525" Height="350" FocusManager.FocusedElement="{Binding ElementName=boxName}"> <StackPanel> <Label Content="_Name" Target="{Binding ElementName=boxName}" /> <TextBox x:Name="boxName" Text="Donald Duck"> <i:Interaction.Behaviors> <local:SelectTextOnFocus/> </i:Interaction.Behaviors> </TextBox> <Label Content="_Beruf" Target="{Binding ElementName=boxBeruf}" /> <TextBox x:Name="boxBeruf" Text="Lebemann" /> <Label Content="Stadt" Target="{Binding ElementName=boxStadt}" /> <TextBox x:Name="boxStadt" Text="Entenhausen"> <i:Interaction.Behaviors> <local:SelectTextOnFocus/> </i:Interaction.Behaviors> </TextBox> </StackPanel> </Window>
Die komplette Solution kann im GitHub abgerufen werden.