這裏的另一種方法......
你想要做什麼是不實際的旋轉,而是沿着橢圓形路徑的轉換。問題是,一個TranslateTransform
由X和Y定義,而不是角度和半徑......但是更容易爲角度設置動畫,因此您必須將極座標轉換爲笛卡爾座標。
要做到這一點,讓我們定義兩個轉換器:SinConverter
和CosConverter
:
public class SinConverter : IValueConverter
{
#region Implementation of IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
try
{
double angle = System.Convert.ToDouble(value);
double angleRad = Math.PI * angle/180;
double radius = System.Convert.ToDouble(parameter);
return radius * Math.Sin(angleRad);
}
catch
{
return Binding.DoNothing;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
public class CosConverter : IValueConverter
{
#region Implementation of IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
try
{
double angle = System.Convert.ToDouble(value);
double angleRad = Math.PI * angle/180;
double radius = System.Convert.ToDouble(parameter);
return radius * Math.Cos(angleRad);
}
catch
{
return Binding.DoNothing;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
現在,我們需要的角度屬性動畫:所以我們定義的資源的虛擬RotateTransform
,那將是目標動畫。
接下來,我們在「衛星」上應用TranslateTransform
,我們使用我們的轉換器將X和Y綁定到角度。
最後,我們只需要創建動畫本身,這將動畫角度。
下面是完整的XAML:
<Window x:Class="WpfCS.Orbit"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:WpfCS"
Title="Orbit"
Height="300" Width="300">
<Window.Resources>
<my:SinConverter x:Key="sinConverter" />
<my:CosConverter x:Key="cosConverter" />
<RotateTransform x:Key="rotate" Angle="0" />
</Window.Resources>
<Grid>
<Rectangle Width="30" Height="30" Fill="Blue">
<Rectangle.RenderTransform>
<TranslateTransform X="{Binding Path=Angle,
Source={StaticResource rotate},
Converter={StaticResource cosConverter},
ConverterParameter=100}"
Y="{Binding Path=Angle,
Source={StaticResource rotate},
Converter={StaticResource sinConverter},
ConverterParameter=60}"/>
</Rectangle.RenderTransform>
</Rectangle>
<Ellipse Width="5" Height="5" Fill="White" Stroke="Black" StrokeThickness="1" />
</Grid>
<Window.Style>
<Style TargetType="Window">
<Style.Triggers>
<EventTrigger RoutedEvent="Loaded">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.Target="{StaticResource rotate}"
Storyboard.TargetProperty="Angle"
From="0" To="360" Duration="0:0:5"
RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
</Window.Style>
</Window>
它也通過X&Y動畫,很好的完成這個任務。 – 2011-04-15 20:38:44
謝謝托馬斯,這是我一直在尋找的答案。 – zlat 2011-04-18 12:00:22