Laden...

Wie kann ich den aktiven Text in einer TextBox markieren wenn der Fokus gesetzt wird?

Erstellt von GeneVorph vor 4 Jahren Letzter Beitrag vor 4 Jahren 864 Views
G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 4 Jahren
Wie kann ich den aktiven Text in einer TextBox markieren wenn der Fokus gesetzt wird?

Hallo,

Ich habe folgenden Code, um Text in TextBoxen zu markieren, sobald diese Focus bekommen (per Klick oder Tab) in meiner App.xaml.cs:


 public partial class App : Application
    {

        protected override void OnStartup(StartupEventArgs e)
        {
            EventManager.RegisterClassHandler(typeof(TextBox), UIElement.PreviewMouseLeftButtonDownEvent,
               new MouseButtonEventHandler(SelectivelyHandleMouseButton), true);
            EventManager.RegisterClassHandler(typeof(TextBox), UIElement.GotKeyboardFocusEvent,
              new RoutedEventHandler(SelectAllText), true);

            base.OnStartup(e);
        }

        private static void SelectivelyHandleMouseButton(object sender, MouseButtonEventArgs e)
        {
            var textbox = (sender as TextBox);
            if (textbox != null && !textbox.IsKeyboardFocusWithin)
            {
                if (e.OriginalSource.GetType().Name == "TextBoxView")
                {
                    e.Handled = true;
                    textbox.Focus();
                    textbox.SelectAll();
                }
            }
        }

        private static void SelectAllText(object sender, RoutedEventArgs e)
        {
            var textBox = e.OriginalSource as TextBox;
            if (textBox != null)
                textBox.Focus();
                textBox.SelectAll();
        }

    }

Mein XAML-Code:


<Window.Resources>
<Style x:Key="TextBoxFocus" TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=btnSave, Path=IsPressed}" Value="True">
                    <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=txtName}"/>                    
                </DataTrigger>
</Style>
</Window.Resources>

Im Prinzip ist mein Vorhaben recht trivial: in txtName wird Text eingegeben. Klickt man nun auf den Button btnSave, wird der Text gespeichert und die Eingabe in txtName markiert (so dass man gleich die nächste Eingabe machen kann).

Jedenfalls: bei meinem Button btnSave ist IsDefault = "True". Benutze ich also statt der Maus die Entertaste, dann wird zwar mein Eintrag gespeichert, aber der Text in txtName wird nicht markiert. Außer, ich wechsle vorher den Focus auf ein anderes Control (egal, ob per Mouse oder Tab), z.B. zu einer anderen TextBox oder einer ComboBox, etc., dann funktioniert es.

Es hat den Anschein, als wäre es nicht möglich den Text zu markieren, wenn ich unmittelbar nach der Texteingabe Enter drücke. Was auch ganz logisch ist, denn ich habe ja beim Binding für den DataTrigger nur den Path "IsPressed" angegeben.

Gibt es ein Property, mit dem ich auf das Drücken der Enter-Taste reagieren kann? Mir wäre keins bekannt.

Hat jemand eine Idee, wie ich es dennoch mit der "Enter"-Taste bewerkstelligen kann, ohne vorher ein anderes Control in den Fokus rücken zu müssen?

Gruß
Vorph

4.938 Beiträge seit 2008
vor 4 Jahren

In Button.IsPressed steht, daß durch ENTER diese Eigenschaft nicht gesetzt wird, aber generell das Click-Ereignis ausgelöst wird.

G
GeneVorph Themenstarter:in
180 Beiträge seit 2015
vor 4 Jahren

In Button.IsPressed steht, daß durch ENTER diese Eigenschaft nicht gesetzt wird, aber generell das Click-Ereignis ausgelöst wird.

Hm...das erklärt einiges. Gleichzeitig verkompliziert es die Sache natürlich.

Spontan fällt mir nur ein, per Interactivity ein Command an das Click-Ereignis zu hängen und im ViewModel ein Property einzurichten, dass der View sagt, wann das Click-Ereignis eingetreten ist.
Klingt arg "gebastelt". Wahrscheinlich nicht so gut, oder?

Gruß
Vorph