Select Text on Focus

 

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.

Standard

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.

Selected

 

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.

DotNetKicks-DE Image
Advertisements
Dieser Beitrag wurde unter .NET, C#, WPF abgelegt und mit , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s