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

C# 文本块中文本的水平自动滚动,c#,wpf,scrollviewer,textblock,autoscroll,C#,Wpf,Scrollviewer,Textblock,Autoscroll,我希望有一个固定宽度的TextBlock,它有长的、不间断的、水平的文本,我正在寻找一种好的方法,允许用户阅读所有文本。我想要更复杂的东西,而不仅仅是将控件放在滚动查看器中 第一个(理想)选项是将鼠标悬停在文本块上,例如,如果鼠标位于中间右侧,它将向右滚动(从中间移动越远,速度越快)。我想这是可以做到的,通过处理TextBlock上的MouseEnter/MouseOver事件,找出光标在TextBlock中的位置,并根据需要启用一些字幕/动画。我正在寻找如何做到这一点的方法,特别是因为我对WP

我希望有一个固定宽度的
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
控件都被禁用-似乎既不支持
MoveLeft
也不支持
ScrollPageRight
,但
ScollPageDown
(不适用于我的水平场景)工作正常吗


任何关于这两个选项的提示或建议都将不胜感激

对于可重复按钮版本,一个很好的解决方案是增量滚动scrollviewer

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的scrollviewer中,带有两个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;
    }
private int offset=1;
私有int maxOffset=50;
私有无效滚动左键单击(对象发送者,路由目标)
{
sv.ScrollToHorizontalOffset(sv.HorizontalOffset-偏移量);
偏移量+=偏移量<最大偏移量?1:0;
}
私有无效滚动右键单击(对象发送者,路由目标)
{
sv.滚动至水平偏移(sv.水平偏移+偏移);
偏移量+=偏移量<最大偏移量?1:0;
}
私有void scrollRight\u预览鼠标左键(对象发送器,鼠标按钮ventargs e)
{
偏移量=1;
}

我还想称一下,建议不要使用ClickMode=“Hover”。。。用户更习惯于点击按钮。只有我的两分钱。

工具提示是我现在拥有的,但我想尝试一下这个自动滚动的概念。这只是我的观点,但自动滚动对我来说并不太好。我不希望仅仅通过移动鼠标来破坏我的显示。我同意我不希望鼠标输入移动的文本。你们知道箭头会左右滚动。你也许可以调用这些键来获得你想要的效果。说句公道话,我习惯在网上的Flash应用程序中看到类似的行为,但不一定是滚动文本。即使你忘记了TextBlock上的鼠标盖在做什么,我也在努力使用我说过的RepeatButton——有什么想法吗?调用代码中的左右箭头键来滚动文本