如何在不使用WPF中的口吃的情况下跨框架移动FrameworkElement?

时间:2018-05-26 10:09:26

标签: c# wpf canvas frameworkelement

我想移动一个FrameworkElement,例如一个TextBlock,每当按下按钮时,从左到右穿过画布。如果只是单击按钮,FrameworkElement应移动1个像素。

使用下面的代码可以实现这一点,但是当FrameworkElement正在移动时,我会遇到很多口吃。

XAML部分:

<Canvas>
    <TextBlock x:Name="MoveTextBlock" Text="Move Me" Canvas.Left="0"/>
    <RepeatButton Content="Move" Width="90" Height="30" Canvas.Bottom="20" 
Canvas.Left="20" Click="RepeatButton_Click" Delay="150" Interval="2"/>
</Canvas>

在代码隐藏中:

private void RepeatButton_Click(object sender, RoutedEventArgs e)
{
    Canvas.SetLeft(MoveTextBlock, Canvas.GetLeft(MoveTextBlock) + 1);
}

我尝试了什么(但不一定以正确的方式):

  • 使用CacheMode
  • 调整RepeatButton的延迟和间隔
  • 使用BackgroundWorker
  • 使用故事板

故事板几乎完成了这项工作,但我又遇到了另一个问题,一段时间后动画放慢了速度,这也不是我想要的。

是否可以完全避免口吃?

编辑:

我给了故事板另一次尝试。我解决了动画减速时遇到的问题(所有动画都添加到同一个故事板中),但是现在这个解决方案也出现了问题:

private void RepeatButton_Click(object sender, RoutedEventArgs e)
{
    DoubleAnimation doubleAnimation = new DoubleAnimation();
    double left = Canvas.GetLeft(MoveTextBlock);
    doubleAnimation.From = left;
    doubleAnimation.To = left + 1;
    doubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(0));

    Storyboard.SetTargetName(doubleAnimation, MoveTextBlock.Name);
    Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath(Canvas.LeftProperty));

    Storyboard moveTextBlockStoryboard = new Storyboard();
    moveTextBlockStoryboard.Children.Add(doubleAnimation);

    moveTextBlockStoryboard.Begin(MoveTextBlock);
}

0 个答案:

没有答案