WPF滚动字幕文本动画 [英] WPF Marquee Text Animation
问题描述
我可以滚动使用 TranslateTransform
但是当动画接近完成,我想它重新开始的文本。像蛇一样:)
I can scroll text with TranslateTransform
but when the animation is close to finishing I'd like it to begin again. Like a snake :)
这是我得到了什么:
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
<StackPanel.RenderTransform>
<TranslateTransform x:Name="transferCurreny" X="-40"/>
</StackPanel.RenderTransform>
<StackPanel.Triggers>
<EventTrigger RoutedEvent="StackPanel.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation From="0" To="-900" Duration="00:00:10"
Storyboard.TargetProperty="X"
Storyboard.TargetName="transferCurreny"
RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</StackPanel.Triggers>
<TextBlock FontSize="25" x:Name="txtKron" Margin="10,0,7,0"/>
</StackPanel>
这是想什么我:
推荐答案
这样的事情应该做的伎俩。
Something like this should do the trick.
您可以添加画布
到的StackPanel
与2 的TextBlocks
一个设置为0位置,一个设置在 ActualWidth的
的的StackPanel
,那么当第一块文云屏幕外其他块将映入眼帘。
You can add a Canvas
to the StackPanel
with 2 TextBlocks
one set to position 0 and one set to the ActualWidth
of the StackPanel
, then when the first block of text goes offscreen the other block will come into view.
我用画布
的原因是因为画布
是实际支持的唯一因素ClipToBounds =FALSE
这使得第二的TextBlock
即使其放在画布的边界<外可见/ code>本身
The reason I used Canvas
is because Canvas
is the only element that actually supports ClipToBounds="false"
this allows the 2nd TextBlock
to be visible even if its placed outside the bounds of the Canvas
itself
我们还需要一个的IValueConverter
如果您想自右向左滚动,以获得正确的负值。
We also need a IValueConverter
to get the correct negative value if you want to scroll from right to left.
我还添加事件触发对时,SizeChanged
因此,如果窗口大小动画值将正确更新。
I also added event trigger on SizeChanged
so if the window is resized the animation values will update correctly.
code:
namespace WpfApplication9
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
public class NegatingConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is double)
{
return -((double)value);
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value is double)
{
return +(double)value;
}
return value;
}
}
}
XAML中:
<Window x:Class="WpfApplication9.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication9"
Title="MainWindow" Height="83" Width="222" Name="UI" Tag="Tol Level">
<StackPanel Orientation="Horizontal" x:Name="stack">
<StackPanel.Resources>
<local:NegatingConverter x:Key="NegatingConverter" />
<Storyboard x:Key="slide">
<DoubleAnimation From="0" To="{Binding Width, ElementName=canvas, Converter={StaticResource NegatingConverter}}" Duration="00:00:10"
Storyboard.TargetProperty="X"
Storyboard.TargetName="transferCurreny"
RepeatBehavior="Forever"/>
</Storyboard>
</StackPanel.Resources>
<StackPanel.RenderTransform>
<TranslateTransform x:Name="transferCurreny" X="0"/>
</StackPanel.RenderTransform>
<StackPanel.Triggers>
<EventTrigger RoutedEvent="StackPanel.Loaded">
<BeginStoryboard Storyboard="{StaticResource slide}" />
</EventTrigger>
<EventTrigger RoutedEvent="StackPanel.SizeChanged">
<BeginStoryboard Storyboard="{StaticResource slide}" />
</EventTrigger>
</StackPanel.Triggers>
<Canvas x:Name="canvas" Width="{Binding ActualWidth, ElementName=stack}">
<TextBlock Text="StackOverflow" FontSize="25" x:Name="txtKron" Canvas.Left="0"/>
<TextBlock Text="{Binding Text, ElementName=txtKron}" FontSize="25" Canvas.Left="{Binding Width, ElementName=canvas}"/>
</Canvas>
</StackPanel>
</Window>
结果:
编辑:左到右
<StackPanel Orientation="Horizontal" x:Name="stack">
<StackPanel.Resources>
<local:NegatingConverter x:Key="NegatingConverter" />
<Storyboard x:Key="slide">
<DoubleAnimation From="0" To="{Binding Width, ElementName=canvas}" Duration="00:00:10"
Storyboard.TargetProperty="X"
Storyboard.TargetName="transferCurreny"
RepeatBehavior="Forever"/>
</Storyboard>
</StackPanel.Resources>
<StackPanel.RenderTransform>
<TranslateTransform x:Name="transferCurreny" X="0"/>
</StackPanel.RenderTransform>
<StackPanel.Triggers>
<EventTrigger RoutedEvent="StackPanel.Loaded">
<BeginStoryboard Storyboard="{StaticResource slide}" />
</EventTrigger>
<EventTrigger RoutedEvent="StackPanel.SizeChanged">
<BeginStoryboard Storyboard="{StaticResource slide}" />
</EventTrigger>
</StackPanel.Triggers>
<Canvas x:Name="canvas" Width="{Binding ActualWidth, ElementName=stack}">
<TextBlock Text="StackOverflow" FontSize="25" x:Name="txtKron" Canvas.Left="0"/>
<TextBlock Text="{Binding Text, ElementName=txtKron}" FontSize="25" Canvas.Left="{Binding Width, ElementName=canvas, Converter={StaticResource NegatingConverter}}"/>
</Canvas>
</StackPanel>
这篇关于WPF滚动字幕文本动画的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!