Как мне переместить FrameworkElement по холсту без заиканий в WPF? - PullRequest
0 голосов
/ 26 мая 2018

Я хочу переместить 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
  • Использование раскадровки

Раскадровка почти справилась, но через некоторое время у меня появилась другая проблема с замедлением анимации, которая нето, что я хочу.

Можно ли полностью избежать заикания?

РЕДАКТИРОВАТЬ:

Я дал Storyboard еще одну попытку.Я решил проблему с замедлением анимации (все анимации были добавлены в один и тот же раскадровку), но теперь заикание происходит и в этом решении:

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);
}
...