Silverlight / Expression Blend - анимация с использованием вычисленного значения в RenderTransform - PullRequest
0 голосов
/ 27 июля 2011

У меня есть Rectangle в верхней части экрана, который я пытаюсь анимировать в нижней части экрана. Итак, я пытаюсь переместить эту высоту экрана минус высота прямоугольника. Поскольку высота экрана зависит от разрешения и размера браузера, я пытаюсь анимировать это значение свойства ActualHeight в пользовательском элементе управления - 20 (высота прямоугольника).

Кто-нибудь знает хороший способ использовать это вычисленное значение как расстояние, на которое я хочу переместить прямоугольник? Могу ли я использовать собственное выражение для этого, и если да, каким будет выражение? Я также думал о добавлении другого свойства в пользовательский элемент управления, который будет содержать это значение, но мне кажется ненужным, что я должен был бы сделать это. Я бы предпочел просто использовать математику в окне пользовательских выражений, если это возможно. Спасибо за любой совет.

Ответы [ 2 ]

0 голосов
/ 28 июля 2011

Если вы присваиваете имена элементам в раскадровке анимации (т. Е. С помощью 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();
        }
    }
}
0 голосов
/ 28 июля 2011

Не могу представить это без кода.Если ваш объект всегда имеет одинаковую высоту, вы можете создать конвертер, который возвращает ActualHeight корня макета для приложения (App.Current.RootVisual) минус высота объекта (20) и привязать его к свойству DoubleAnimation «To».

...