DoubleAnimation в ScaleTransform - PullRequest
       7

DoubleAnimation в ScaleTransform

6 голосов
/ 28 мая 2010

В качестве демонстрации я пытаюсь использовать DoubleAnimation для свойств ScaleX и ScaleY в ScaleTransform. У меня есть прямоугольник (144х144), который я хочу сделать прямоугольным в течение пяти секунд.

Мой XAML:

<Window x:Class="ScaleTransformTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
    <Grid>
        <Rectangle Name="rect1" Width="144" Height="144" Fill="Aqua">
            <Rectangle.RenderTransform>
                <ScaleTransform ScaleX="1" ScaleY="1" />
            </Rectangle.RenderTransform>
        </Rectangle>
    </Grid>
</Window>

Мой C #:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    ScaleTransform scaly = new ScaleTransform(1, 1);
    rect1.RenderTransform = scaly;

    Duration mytime = new Duration(TimeSpan.FromSeconds(5));
    Storyboard sb = new Storyboard();

    DoubleAnimation danim1 = new DoubleAnimation(1, 1.5, mytime);
    DoubleAnimation danim2 = new DoubleAnimation(1, 0.5, mytime);
    sb.Children.Add(danim1);
    sb.Children.Add(danim2);

    Storyboard.SetTarget(danim1, scaly);
    Storyboard.SetTargetProperty(danim1, new PropertyPath(ScaleTransform.ScaleXProperty));
    Storyboard.SetTarget(danim2, scaly);
    Storyboard.SetTargetProperty(danim2, new PropertyPath(ScaleTransform.ScaleYProperty));

    sb.Begin();
}

К сожалению, когда я запускаю эту программу, она ничего не делает. Прямоугольник остается размером 144х144. Если я покончу с анимацией и просто

ScaleTransform scaly = new ScaleTransform(1.5, 0.5);
rect1.RenderTransform = scaly;

он мгновенно растянется, без проблем. В другом месте есть проблема. Какие-либо предложения? Я прочитал обсуждение на http://www.eggheadcafe.com/software/aspnet/29220878/how-to-animate-tofrom-an.aspx, в котором, похоже, кто-то работает с версией чистого XAML, но код там не показан.

РЕДАКТИРОВАТЬ: В Применение анимированного ScaleTransform в проблеме кода кажется, что у кого-то была очень похожая проблема, я в порядке с использованием его метода, который работал, но какого черта этот string thePath = "(0).(1)[0].(2)"; вообще? Что представляют собой эти цифры?

1 Ответ

7 голосов
/ 28 мая 2010

Вот предложение, это цитата из MSDN Обзор раскадровок , в разделе под названием «Где вы можете использовать раскадровку?»:

Раскадровка может быть использована для анимации свойства зависимости анимируемого классы (для получения дополнительной информации о что делает класс анимируемым, смотрите Обзор анимации). Тем не менее, потому что раскадровка - это базовый уровень особенность, объект должен принадлежать NameScope FrameworkElement или FrameworkContentElement.

Это заставило меня подумать, что объект ScaleTransform не принадлежит NameScope любого FrameworkElement. Даже если Rectangle является FrameworkElement, поскольку ScaleTransform не является частью его логических дочерних элементов, а скорее является значением, назначенным какому-либо другому свойству (в данном случае свойству RenderTransform).

Чтобы обойти это, вам нужно указать целевой объект и PropertyPath по-другому, таким образом:

Storyboard.SetTarget(danim1, rect1);
Storyboard.SetTargetProperty(danim1, 
    new PropertyPath("RenderTransform.(ScaleTransform.ScaleX)"));

Пробовал, и это работает, хотя я сам не до конца понимаю цитату из MSDN: -)

...