我在WPF中有一个滚动的新闻标签,用于传达警报(他们的偏好不是我的)。实现工作但我发现一个问题,随着文本变得更长,这个问题更加明显。文本滚动然后突然停止然后重新启动。
<Border Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="5" BorderBrush="White" BorderThickness="0,3,0,3">
<StackPanel Orientation="Horizontal" x:Name="Ticker" Background="Transparent" >
<StackPanel.Triggers>
<EventTrigger RoutedEvent="FrameworkElement.Loaded">
<BeginStoryboard x:Name="NewsTicker">
<Storyboard RepeatBehavior="Forever">
<DoubleAnimation From="{Binding ElementName=Ticker, Path=ActualWidth}" To="{Binding ElementName=Ticker, Path=ActualWidth, Converter={StaticResource NegConverter}}" Storyboard.TargetName="translate" Storyboard.TargetProperty="X" Duration="0:0:35" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="WrapPanel.MouseEnter">
<PauseStoryboard BeginStoryboardName="NewsTicker" />
</EventTrigger>
<EventTrigger RoutedEvent="WrapPanel.MouseLeave">
<ResumeStoryboard BeginStoryboardName="NewsTicker" />
</EventTrigger>
</StackPanelPanel.Triggers>
<TextBlock Text="{Binding NewsTicker, IsAsync=True}" Margin="0,0,0,0" Padding="0,0,0,0" VerticalAlignment="Top" >
<TextBlock.RenderTransform>
<TranslateTransform x:Name="translate" />
</TextBlock.RenderTransform>
</TextBlock>
</StackPanelPanel>
</Border>
我希望文本从右向左滚动,直到它滚出屏幕,然后从无限循环中再次返回。
我从SO尝试了几种不同的方法,包括使用厚度动画设置边距动画以及使用画布的示例,但它们都没有实际工作。
有什么建议吗?
答案 0 :(得分:1)
好的,所以它不跳跃的关键是绑定到正确的东西 - 我们想要将To
字段绑定到TextBlock的ActualWidth
,而不是ActualWidth
StackPanel
(更小)
因此我们可以将DoubleAnimation更改为:
<DoubleAnimation From="{Binding ElementName=Ticker, Path=ActualWidth}" To="{Binding ElementName=TickerTextBlock, Path=ActualWidth, Converter={StaticResource NegConverter}}" Storyboard.TargetName="translate" Storyboard.TargetProperty="X" Duration="0:0:4" />
并向包含文字的x:Name="TickerTextBlock"
添加TextBlock
。
不幸的是,这不能直接起作用(相反,它使用动画的绑定前文本加载的初始值0:!)。动画通常是非常易变的 - 我相信它只与创建和运行一次有关,因此绑定的值仅在首次运行动画时使用。 (但我可能会误解)
当然,对我的代码副本起作用的一个解决方案是确保首先加载文本(即我们将动画上的TextBlock
放在 XAML中,然后更改绑定,以便它不是异步。)
如果您希望保持异步,那么我相信我们需要在文本更改时重新启动双动画。我会进一步调查,但现在已经很晚了,我要去睡觉了(对不起!)