我希望有一个固定宽度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.
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
(对我的水平方案没有好处)工作正常吗?
任何选项的任何提示或建议都将非常感谢!
答案 0 :(得分: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”...用户更习惯于点击按钮。只是我的两分钱。