滚动NewsTicker正在尽早切断

时间:2014-09-11 20:11:53

标签: c# wpf xaml mvvm

我在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尝试了几种不同的方法,包括使用厚度动画设置边距动画以及使用画布的示例,但它们都没有实际工作。

有什么建议吗?

1 个答案:

答案 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中,然后更改绑定,以便它不是异步。)

如果您希望保持异步,那么我相信我们需要在文本更改时重新启动双动画。我会进一步调查,但现在已经很晚了,我要去睡觉了(对不起!)