Есть несколько решений для этого. Возможно, проще всего было бы реализовать пользовательское поведение (вам нужно будет сослаться на System.Windows.Interactivity.dll) и подключить некоторые события, предоставляемые TextBox, такие как GotFocus и LostFocus. Вот пример, который я сделал для выделения всего текста TextBox, когда он становится сфокусированным:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interactivity;
namespace TextBoxUtility
{
public class TextBoxSelectAllOnFocusBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.PreviewMouseLeftButtonDown += OnPreviewMouseLeftButtonDown;
this.AssociatedObject.GotKeyboardFocus += OnSelectAll;
this.AssociatedObject.MouseDoubleClick += OnSelectAll;
}
protected override void OnDetaching()
{
this.AssociatedObject.PreviewMouseLeftButtonDown -= OnPreviewMouseLeftButtonDown;
this.AssociatedObject.GotKeyboardFocus -= OnSelectAll;
this.AssociatedObject.MouseDoubleClick -= OnSelectAll;
base.OnDetaching();
}
private static void OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var textbox = sender as TextBox;
if (textbox != null && !textbox.IsKeyboardFocusWithin)
{
textbox.Focus();
e.Handled = true;
}
}
private static void OnSelectAll(object sender, RoutedEventArgs e)
{
var textbox = sender as TextBox;
if (textbox != null)
{
textbox.SelectAll();
}
}
Редактировать: Забыл показать, как подключить поведение к TextBox.
Чтобы присоединить Behavior, в вашем XAML вам нужно добавить ссылку на пространство имен в пространство имен вашего Behavior, а затем присоединить его как дочерний элемент разметки TextBox, например:
<TextBox Text="{Binding ....}">
<i:Interaction.Behaviors>
<utility:TextBoxSelectAllOnFocusBehavior />
</i:Interaction.Behaviors>
</TextBox>
Вы могли бы сделать что-то подобное, хотя с вашим вы бы хотели подключиться к событиям, связанным с LostFocus, и настроить содержимое свойства Text TextBox.