【问题标题】:Horizontal auto-scroll of text in a TextBlockTextBlock 中文本的水平自动滚动
【发布时间】:2012-03-26 10:59:54
【问题描述】:

我想要一个固定宽度的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 (对我的水平场景没有好处)工作正常吗?

任何关于任一选项的提示或建议将不胜感激!

【问题讨论】:

  • 工具提示是我现在拥有的,但想尝试一下这个自动滚动的概念。
  • 只是我的意见,但自动滚动对我来说听起来不太好。我不希望我的显示器仅仅通过移动鼠标就被弄脏了。
  • 我同意我不希望鼠标输入移动文本。您确实知道左右箭头会滚动。您也许可以调用这些键来获得您正在寻找的效果。
  • 公平评论,我习惯于在网络上的 Flash 应用程序中看到类似的行为,但不一定是滚动文本。即使您忘记了 TextBlock 上的鼠标悬停在做任何事情,我也会像我说的那样在重复按钮上苦苦挣扎 - 对此有什么想法吗?
  • 在代码中调用左右方向键来滚动文本

标签: c# wpf scrollviewer textblock autoscroll


【解决方案1】:

可重复按钮版本的一个很好的解决方案是逐步滚动滚动查看器。

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 的滚动查看器中,带有两个重复按钮。

如果你想加速,你坚持的时间越长:

    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"... 用户更习惯于单击按钮。只是我的两分钱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多