2016-06-23 3 views
0

Когда откроется новое окно, я хочу сфокусировать конкретное текстовое поле и выделить весь текст в нем. Я попробовал его на основе этого урока: https://blogs.msdn.microsoft.com/argumentnullexceptionblogpost/2013/04/12/a-simple-selectall-behavior-for-textboxes/Фокус TextBox и выберите весь текст после инициализации окна

Для фокусирования элемента я использую это в моей сетке:

<Grid d:DataContext="{StaticResource DesignTimeLayerViewModel1}" FocusManager.FocusedElement="{Binding ElementName=LayerNameInput}"> 

И попробовал с поведением взаимодействия:

<TextBox x:Name="LayerNameInput" 
    Text="{Binding MapLayerName, UpdateSourceTrigger=PropertyChanged}" 
    VerticalContentAlignment="Center" 
    Width="240"> 
    <i:Interaction.Behaviors> 
     <behaviors:SelectAllTextBoxBehavior></behaviors:SelectAllTextBoxBehavior> 
    </i:Interaction.Behaviors> 
</TextBox> 

Поведение кода :

public class SelectAllTextBoxBehavior : Behavior<TextBox> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     this.AssociatedObject.GotFocus += this.OnTextBoxGotFocus; 
    } 

    protected override void OnDetaching() 
    { 
     this.AssociatedObject.GotFocus -= this.OnTextBoxGotFocus; 
     base.OnDetaching(); 
    } 

    private void OnTextBoxGotFocus(object sender, RoutedEventArgs e) 
    { 
     this.AssociatedObject.SelectAll(); 
    } 
} 

Проблема связана с bindi нг. Когда окно создается, поведение срабатывает корректно, но на самом деле в TextBox нет текста. Затем TextBox инициализируется и устанавливает текст в значение привязанной переменной, и выбор теряется. Если я перефокусирую TextBox, используя несколько раз Tab, он отлично работает.

Как можно сфокусировать TextBox и выделить весь текст при создании окна? Без большого количества кода позади него?

Заранее благодарен!

ответ

0

Я исправил проблему с обходным путем. Когда вводный текст TextBox устанавливается во время запуска окна, запускается событие OnTextBoxTextChanged. Я просто поймаю его, выберу текст и удалю его.

Преимущество этого по сравнению с вашим ответом Темный тамплиер заключается в том, что, когда я снова фокусирую TextBox, например, с вкладкой весь текст будет выбран снова.

protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.GotFocus += OnTextBoxGotFocus; 
     AssociatedObject.TextChanged += OnTextBoxTextChanged; 
    } 

    protected override void OnDetaching() 
    { 
     AssociatedObject.GotFocus -= OnTextBoxGotFocus; 
     AssociatedObject.TextChanged -= OnTextBoxTextChanged; 
     base.OnDetaching(); 
    } 

    private void OnTextBoxGotFocus(object sender, RoutedEventArgs e) 
    { 
     AssociatedObject.SelectAll(); 
    } 

    private void OnTextBoxTextChanged(object sender, RoutedEventArgs e) 
    { 
     AssociatedObject.SelectAll(); 
     AssociatedObject.TextChanged -= OnTextBoxTextChanged; 
    } 
0

хорошо вы могли бы использовать «window_loaded» событие, чтобы сосредоточить свое текстовое поле вот пример:

private void window_Loaded(object sender, RoutedEventArgs e) 
    { 
     textBox.Focus(); 
     textBox.SelectAll(); 
    } 
Смежные вопросы