#wpf #blend
#wpf ( ВП ) #смешать #wpf #смешивание
Вопрос:
Я создал простое поведение смешивания для привязки к элементам текстового поля. Его цель состоит в том, чтобы прокрутить текстовое поле до конца, когда оно попадает в фокус, и прокрутить его обратно к началу, когда оно теряет фокус.
public class TextBoxScrollToEndBehaviour : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.GotFocus = AssociatedObject_GotFocus;
AssociatedObject.LostFocus = AssociatedObject_LostFocus;
}
private void AssociatedObject_LostFocus(object sender, System.Windows.RoutedEventArgs e)
{
var textBox = sender as TextBox;
textBox.ScrollToHorizontalOffset(0);
}
private void AssociatedObject_GotFocus(object sender, System.Windows.RoutedEventArgs e)
{
var textBox = sender as TextBox;
textBox.ScrollToHorizontalOffset(double.PositiveInfinity);
}
}
Xaml:
<TextBox Text="{Binding MyBinding, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Behaviors>
<behaviours:TextBoxScrollToEndBehaviour />
</i:Interaction.Behaviors>
</TextBox>
Это отлично работает, когда я фокусирую текстовое поле, а затем нажимаю на какой-нибудь другой элемент управления, чтобы потерять фокус. Проблема в том, что если я переключаю фокус между двумя текстовыми полями, которые имеют одинаковое поведение, прокрутка не возвращается к 0 в первом текстовом поле, даже событие LostFocus корректно запускается в нем.
Чего мне здесь не хватает? Спасибо!
Платформа .NET Framework 4.7.2
Ответ №1:
Я выяснил это, заменив эту строку в событии LostFocus:
textBox.ScrollToHorizontalOffset(0);
с
textBox.ScrollToLine(0);
это поведение отлично работает в любых условиях.