Проблема с одинаковым поведением смешивания, применяемым к нескольким элементам

#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); 
  

это поведение отлично работает в любых условиях.