Storyboard.GetTarget в Silverlight для Windows Mobile - PullRequest
2 голосов
/ 15 августа 2010

У меня проблема с приложением WP7. Я пытаюсь написать пример приложения WP7 из кода WPF.

    private void storyboard_Completed(object sender, EventArgs e)
    {
        ClockGroup clockGroup = (ClockGroup)sender;

        // Get the first animation in the storyboard, and use it to find the
        // bomb that's being animated.
        DoubleAnimation completedAnimation = (DoubleAnimation)clockGroup.Children[0].Timeline;
        Bomb completedBomb = (Bomb)Storyboard.GetTarget(completedAnimation);

похоже, что класса ClockGroup нет, а Storyboard не имеет метода GetTarget (что немного странно, поскольку есть метод SetTarget) Есть ли взломать, чтобы получить тот же функционал?

1 Ответ

7 голосов
/ 15 августа 2010

Я мало знаю о WPF, но в Silverlight или WP7 дети Storyboard имеют тип TimeLine.Также у самого StoryBoard будет событие Completed, к которому вы будете привязаны.Поэтому, по крайней мере, первая часть кода будет выглядеть так: -

private void storyboard_Completed(object sender, EventArgs e)
{
    Storyboard sb = (Storyboard)sender;

    DoubleAnimation completedAnimation = (DoubleAnimation)sb.Children[0];

Теперь для хитрого бита.

На самом деле весьма необычно для Storyboard.SetTarget использование в коде Silverlight.Я предполагаю, что игровой код с большей вероятностью будет генерировать элементы и анимацию в коде и, следовательно, с большей вероятностью будет использовать SetTarget.Если это то, что вы хотите сделать, то вам нужно будет создать собственное присоединенное свойство, которое имеет как Get, так и Set, с измененным обратным вызовом для этого свойства, вызвать Storyboard.SetTarget.

Вот код: -

public static class StoryboardServices
{
    public static DependencyObject GetTarget(Timeline timeline)
    {
        if (timeline == null)
            throw new ArgumentNullException("timeline");

        return timeline.GetValue(TargetProperty) as DependencyObject;
    }

    public static void SetTarget(Timeline timeline, DependencyObject value)
    {
        if (timeline == null)
            throw new ArgumentNullException("timeline");

        timeline.SetValue(TargetProperty, value);
    }

    public static readonly DependencyProperty TargetProperty =
            DependencyProperty.RegisterAttached(
                    "Target",
                    typeof(DependencyObject),
                    typeof(Timeline),
                    new PropertyMetadata(null, OnTargetPropertyChanged));

    private static void OnTargetPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Storyboard.SetTarget(d as Timeline, e.NewValue as DependencyObject);
    }
}

Теперь код SetTarget станет: -

 StoryboardServices.SetTarget(completedAnimation, bomb);

Тогда завершенное событие может получить цель с помощью: -

 Bomb completedBomb = (Bomb)StoryboardServices.GetTarget(completedAnimation);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...