Я думаю, что это хорошо работает:
private void ValueText_GotFocus(object sender, RoutedEventArgs e)
{
TextBox tb = (TextBox)e.OriginalSource;
tb.Dispatcher.BeginInvoke(
new Action(delegate
{
tb.SelectAll();
}), System.Windows.Threading.DispatcherPriority.Input);
}
Если вы хотите реализовать его как метод расширения:
public static void SelectAllText(this System.Windows.Controls.TextBox tb)
{
tb.Dispatcher.BeginInvoke(
new Action(delegate
{
tb.SelectAll();
}), System.Windows.Threading.DispatcherPriority.Input);
}
А в вашем событии GotFocus:
private void ValueText_GotFocus(object sender, RoutedEventArgs e)
{
TextBox tb = (TextBox)e.OriginalSource;
tb.SelectAllText();
}
Я обнаружил решение выше, потому что несколько месяцев назад я искал способ установить фокус на конкретный элемент UIElement. Я где-то обнаружил код ниже (кредит предоставляется), и он работает хорошо. Я публикую его, хотя он не имеет прямого отношения к вопросу OP, поскольку демонстрирует ту же схему использования Dispatcher для работы с UIElement.
// Sets focus to uiElement
public static void DelayedFocus(this UIElement uiElement)
{
uiElement.Dispatcher.BeginInvoke(
new Action(delegate
{
uiElement.Focusable = true;
uiElement.Focus();
Keyboard.Focus(uiElement);
}),
DispatcherPriority.Render);
}