Silverlight / Expression Blend - 使用RenderTransform中的计算值进行动画处理

时间:2011-07-27 19:54:50

标签: silverlight animation expression-blend

我在屏幕顶部有一个Rectangle我试图动画到屏幕底部。所以,我试图将屏幕的高度减去矩形的高度。由于屏幕高度会因分辨率和浏览器大小而异,我试图在用户控件上设置ActualHeight属性的值 - 20(矩形的高度)。

有没有人知道将这个计算值用作我想要移动矩形的距离的好方法?我可以为此使用自定义表达式,如果是,表达式是什么?我还考虑过向用户控件中添加另一个包含此值的属性,但我似乎没必要这样做。如果可能的话,我宁愿在自定义表达式框中使用一些数学。谢谢你的任何建议。

2 个答案:

答案 0 :(得分:0)

如果没有一些代码,无法想象这一点。如果您的对象总是具有相同的高度,您可以创建一个转换器,它返回应用程序布局根的ActualHeight(App.Current.RootVisual)减去对象高度(20)并将其绑定到DoubleAnimation的“To”属性。 / p>

答案 1 :(得分:0)

如果您在动画故事板中命名元素(即使用x:Name),则可以更改故事板中的值,而无需在代码中创建整个事物。

这是一个完整的示例,可以在您调整浏览器大小时将矩形移动到底部:

Animation.xaml

<UserControl
    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"
    mc:Ignorable="d"
    x:Class="StackOvewflow2.Animation"
    d:DesignWidth="640" d:DesignHeight="480"
    SizeChanged="UserControl_SizeChanged">
    <UserControl.Resources>
        <Storyboard x:Name="Storyboard1">
            <DoubleAnimation x:Name="TargetValue" Duration="0:0:1" To="380" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/>
        </Storyboard>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot">
        <Rectangle x:Name="rectangle" Fill="LightBlue" Height="100" Stroke="Blue" StrokeThickness="6" VerticalAlignment="Top" HorizontalAlignment="Center" Width="400" RenderTransformOrigin="0.5,0.5">
            <Rectangle.RenderTransform>
                <CompositeTransform/>
            </Rectangle.RenderTransform>
        </Rectangle>
    </Grid>
</UserControl>

Animation.cs

using System.Windows;
using System.Windows.Controls;

namespace StackOvewflow2
{
    public partial class Animation : UserControl
    {
        public Animation()
        {
            InitializeComponent();
        }

        private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            this.TargetValue.To = e.NewSize.Height - rectangle.Height;
            Storyboard1.Begin();
        }
    }
}