文本块中文本的水平自动滚动

本文关键字:文本 滚动 中文 水平 | 更新日期: 2023-09-27 18:28:57

我想要一个固定宽度的TextBlock,它有长的、连续的、水平的文本,并且正在寻找一种允许用户读取所有文本的好方法。我想要一些比把控件放在ScrollViewer中更复杂的东西。

第一个(理想的)选项是能够将鼠标悬停在TextBlock上,例如,如果鼠标位于中心右侧,它将向右滚动(离中心越远,速度就越快)。我想这是可以做到的,通过处理TextBlock上的MouseEnter/MouseOver事件,弄清楚光标在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控件都被禁用了——似乎MoveLeftScrollPageRight都不受支持,但ScollPageDown(对我的水平场景没有好处)工作正常吗?

任何关于这两种选择的提示或建议都将不胜感激!

文本块中文本的水平自动滚动

对于可重复按钮版本,一个好的解决方案是只递增滚动滚动查看器。

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的滚动查看器中,其中有两个repeatbutton。

如果你想加快你持有的时间:

    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="悬停"。。。用户更习惯于点击按钮。只有我的两美分。