Горизонтальная автопрокрутка текста в TextBlock - PullRequest
2 голосов
/ 26 марта 2012

Я хочу иметь фиксированную ширину TextBlock с длинным непрерывным горизонтальным текстом, и я ищу хороший подход, позволяющий пользователю читать весь текст.Я хочу что-то более сложное, чем просто поместить элемент управления в ScrollViewer.

Первый (идеальный) вариант - это возможность навести курсор мыши на TextBlock и, если мышьнапример, справа от центра, он будет прокручиваться вправо (с увеличением скорости, чем дальше вы двигаетесь от центра).Я предполагаю, что это выполнимо, обрабатывая события MouseEnter / MouseOver в TextBlock, выясняя, где находится курсор внутри TextBlock, и включая некоторую выделенную область / анимацию в зависимости от ситуации.Я ищу подходы к тому, как это сделать, тем более, что у меня мало опыта с анимацией в WPF.Я хотел бы выяснить детали сам, но изо всех сил пытаюсь начать.

Второй вариант будет иметь RepeatButton по обе стороны текста, и когда вы наводите курсор на это,он прокручивает текст.

Начальная попытка:

<RepeatButton ClickMode="Hover"
              Command="{x:Static ComponentCommands.MoveLeft}"
              CommandTarget="{Binding ElementName=TextAutoScroller}"
              Content="Go left" />

<ScrollViewer x:Name="TextAutoScroller" Grid.Column="1"
              VerticalScrollBarVisibility="Disabled"
              HorizontalScrollBarVisibility="Hidden">
    <TextBlock VerticalAlignment="Center"
               Text="The quick brown fox jumps over the lazy dog.&#x0d;&#x0a;The quick brown fox jumps over the lazy dog.&#x0d;&#x0a;The quick brown fox jumps over the lazy dog." />
</ScrollViewer>

<RepeatButton Grid.Column="2"
              ClickMode="Hover"
              Command="{x:Static ComponentCommands.ScrollPageRight}"
              CommandTarget="{Binding ElementName=TextAutoScroller}"
              Content="Go right" />

Проблема заключается в том, что оба элемента управления RepeatButton отключены - кажется, что ни MoveLeft, ни ScrollPageRight не поддерживаются, но ScollPageDown (не подходит для моего горизонтального сценария) работает нормально?

Буду признателен за любые советы или предложения по любому из вариантов!

1 Ответ

1 голос
/ 04 апреля 2012

Хорошим решением для повторяемой версии кнопки было бы просто прокручивать прокручиваемый просмотрщик постепенно.

private void scrollLeft_Click(object sender, RoutedEventArgs e)
{
    sv.ScrollToHorizontalOffset(sv.HorizontalOffset - 10);
}

private void scrollRight_Click(object sender, RoutedEventArgs e)
{
    sv.ScrollToHorizontalOffset(sv.HorizontalOffset + 10);
}

Выше предполагается, что ваш текст обернут в просмотрщик с именем sv с двумя кнопками повторения.1005 * Если вы хотите ускорить, чем дольше вы его держите:

    private int offset = 1;
    private int maxOffset = 50;

    private void scrollLeft_Click(object sender, RoutedEventArgs e)
    {
        sv.ScrollToHorizontalOffset(sv.HorizontalOffset - offset);
        offset += offset < maxOffset ? 1 : 0;
    }

    private void scrollRight_Click(object sender, RoutedEventArgs e)
    {
        sv.ScrollToHorizontalOffset(sv.HorizontalOffset + offset);
        offset += offset < maxOffset ? 1 : 0;
    }

    private void scrollRight_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        offset = 1;
    }

Я бы также взвесил и предложил бы не использовать ClickMode = "Hover" ... Пользователи более привыкли нажиматькнопок.Просто мои два цента.

...