在画布上跟踪WPF元素

在画布上跟踪WPF元素,wpf,animation,Wpf,Animation,我正在探索WPF动画和放松功能。我在画布上有一个元素,当我点击它时,它会被设置动画。单击元素时变换的X和Y位置 <Window x:Class="WpfAnimationExample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx

我正在探索WPF动画和放松功能。我在画布上有一个元素,当我点击它时,它会被设置动画。单击元素时变换的X和Y位置

<Window x:Class="WpfAnimationExample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfAnimationExample"
    mc:Ignorable="d"
    Title="MainWindow" Height="250" Width="300">
<Window.Resources>
    <Style x:Key="EllipseEasing" TargetType="Ellipse">
        <Setter Property="Width" Value="20"/>
        <Setter Property="Height" Value="20"/>
        <Setter Property="Fill" Value="Black"/>
        <Setter Property="RenderTransform">
            <Setter.Value>
                <TranslateTransform X="0" Y="0"/>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <EventTrigger RoutedEvent="MouseDown">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation From="0" To="260" Duration="0:0:5"
                                         Storyboard.TargetProperty="RenderTransform.(TranslateTransform.X)"/>
                        <DoubleAnimation From="0" To="130" Duration="0:0:5"
                                         Storyboard.TargetProperty="RenderTransform.(TranslateTransform.Y)">
                            <DoubleAnimation.EasingFunction>
                                <BackEase EasingMode="EaseInOut"/>
                            </DoubleAnimation.EasingFunction>
                        </DoubleAnimation>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<Canvas Name="Canvas">
    <Ellipse Name="MainEllipse" Style="{StaticResource EllipseEasing}" Canvas.Top="30" MouseDown="Ellipse_MouseDown" />
</Canvas>

这一切都有效。 我试图以图形化的方式看到元素运动的轨迹。我希望每100毫秒在任何地方绘制元素的克隆,但我不知道如何在画布上一瞬间获取元素的当前位置

我在单击元素时添加了一个并行处理程序,但这似乎不起作用

private void Ellipse_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Dispatcher.BeginInvoke(
            new ThreadStart((async () =>
        {
            for (int t = 0; t < 5; t++)
            {

                try
                {
                    var x = Canvas.GetLeft(MainEllipse);
                    var y = Canvas.GetTop(MainEllipse);

                    var rx = ((TranslateTransform)MainEllipse.RenderTransform).X;
                    var ry = ((TranslateTransform)MainEllipse.RenderTransform).Y;
                    Ellipse newControl = new Ellipse { Height = MainEllipse.Height, Width = MainEllipse.Width, Fill = Brushes.Blue };
                    Canvas.SetLeft(newControl, rx);
                    Canvas.SetTop(newControl, ry);
                    Canvas.Children.Add(newControl);
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception);
                    throw;
                }
                await Task.Delay(100);
            }

        })));

    }
private void椭圆\u MouseDown(对象发送器,MouseButtonEventArgs e)
{
调度程序。开始启动(
新线程开始((异步()=>
{
for(int t=0;t<5;t++)
{
尝试
{
var x=Canvas.GetLeft(main椭圆);
var y=Canvas.GetTop(main椭圆);
var rx=((TranslateTransform)MainEllipse.RenderTransform).X;
var ry=((TranslateTransform)MainEllipse.RenderTransform).Y;
椭圆newControl=new Ellipse{Height=MainEllipse.Height,Width=MainEllipse.Width,Fill=Brusks.Blue};
Canvas.SetLeft(newControl,rx);
Canvas.SetTop(newControl,ry);
Canvas.Children.Add(newControl);
}
捕获(异常)
{
控制台写入线(例外);
投掷;
}
等待任务。延迟(100);
}
})));
}
建议? TIA

如果要获取“当前”值,应访问实际正在设置动画的属性,例如:

((TranslateTransform)newControl.RenderTransform).X

…假设您设置了
RenderTransform

X
属性的动画,则您正在椭圆的RenderTransform中设置TranslateTransform的动画。这不会神奇地设置Canvas.Left和Canvas.Top附加属性。我看到了。如何在任何时候获取椭圆的实际位置?@Jeff:您是否尝试访问实际正在设置动画的属性?例如:
((TranslateTransform)newControl.RenderTransform).X。或者只是将Canvas.Left和Canvas.Top设置为特定的目标值,而不设置动画的“From”值。您知道Left/Top和TranslateTransform是相加的吗?为了保持简单,只使用其中一种机制。