在画布上跟踪WPF元素
我正在探索WPF动画和放松功能。我在画布上有一个元素,当我点击它时,它会被设置动画。单击元素时变换的X和Y位置在画布上跟踪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
<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是相加的吗?为了保持简单,只使用其中一种机制。