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.
The quick brown fox jumps over the lazy dog.
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——有什么想法吗?调用代码中的左右箭头键来滚动文本