У меня есть некоторая анимация прокрутки текста, измененная с этого поста на MSDN . У меня есть две проблемы с этим, хотя.
Во-первых, мне нужно иметь возможность обновлять текст через определенные промежутки времени. Однако, когда OnTick () срабатывает, я получаю следующую ошибку: «Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им». Я пробовал несколько разных вещей и опубликовал один метод, который я пробовал.
Во-вторых, вместо того, чтобы прокручивать взад и вперед, мне действительно нужно, чтобы текст вел себя как истинный шатер и двигался в одном направлении, при этом содержимое постоянно течет без пробелов, то есть «abcdeabcde ...», а не «abcde» , Для этого потребуются две раскадровки, работающие в тандеме с одним и тем же текстом, или есть другой способ сделать это?
Storyboard storyboard = new Storyboard();
Timer timer;
public void OnLoad(object sender, RoutedEventArgs e)
{
_presenter.OnViewReady();
StartMarquee();
}
public MyControl()
{
InitializeComponent();
Loaded += OnLoad;
timer = new Timer(OnTick, null, 10000, 10000);
}
private void OnTick(object state)
{
storyboard.Stop(marqueeText);
storyboard = new Storyboard();
marqueeText.Text =
"Fusce id massa sed tortor volutpat viverra. Mauris ut quam. Fusce iaculis magna at urna. In sed dui vitae quam faucibus ullamcorper. Donec hendrerit magna eget neque. Mauris sit amet risus dictum mauris ultricies ornare. Phasellus lectus leo, mattis eget, ultrices vel, suscipit eu, tellus. Integer ut enim. Suspendisse hendrerit mattis sem. Aenean interdum elementum libero. ";
StartMarquee();
}
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
base.OnRenderSizeChanged(sizeInfo);
marqueeText.Text =
"Is it possible to create a marquee or scrolling text in WPF? Is it possible to create a marquee or scrolling text in WPF? Is it possible to create a marquee or scrolling text in WPF? Is it possible to create a marquee or scrolling text in WPF? Is it possible to create a marquee or scrolling text in WPF? Is it possible to create a marquee or scrolling text in WPF?";
}
private void StartMarquee()
{
var canvas = CommonFunctions.FindVisualParent<Canvas>(marqueeText);
if (marqueeText.ActualWidth < canvas.ActualWidth) return;
var duration = new Duration(TimeSpan.FromSeconds(marqueeText.ActualWidth / 60));
var animation = new DoubleAnimation(-marqueeText.ActualWidth, canvas.ActualWidth, duration);
animation.RepeatBehavior = RepeatBehavior.Forever;
Storyboard.SetTargetName(animation, "rtTTransform");
animation.AutoReverse = false;
Storyboard.SetTargetProperty(animation, new PropertyPath(TranslateTransform.XProperty));
storyboard.Children.Add(animation);
storyboard.Begin(marqueeText);
}
В представлении элемент управления объявлен как
<Canvas Grid.Column="1" HorizontalAlignment="Stretch" ClipToBounds="True" Margin="10,0">
<TextBlock Canvas.Left="0" Canvas.Top="0" x:Name="marqueeText" TextWrapping="NoWrap" VerticalAlignment="Center"
Grid.Column="1" Foreground="{x:Static Brushes.White}" ClipToBounds="False" FontSize="16">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform x:Name="rtTTransform"/>
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
</Canvas>
Заранее спасибо, я все еще работаю над этим и буду обновлять с любыми найденными изменениями.
[Отредактировано] Удален AutoReverse, чтобы сделать вещи менее запутанными и больше приближаться к тому, что я пытаюсь достичь.