DoubleAnimation / Error при попытке создать XAML - PullRequest
2 голосов
/ 20 августа 2009

Я применяю DoubleAnimation к элементу фреймворка во время выполнения. Вот фрагмент кода:

foreach (FrameworkElement objInnerElement in objFrameWorkElement)
{
    Point ElementPosition = new Point(Canvas.GetLeft(objInnerElement), Canvas.GetTop(objInnerElement));

    DoubleAnimation db = new DoubleAnimation();
    //db.From = objMoveIn.From;

    db.AutoReverse = objMoveIn.AutoReverse;
    if (objMoveIn.Repeat)
        db.RepeatBehavior = RepeatBehavior.Forever;
    db.Duration = TimeSpan.FromSeconds(objMoveIn.AnimationDuration);

    Storyboard story = new Storyboard();
    if (objMoveIn.ddlDirection.SelectedIndex == 0)
    {
        //(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.X)
        Storyboard.SetTargetProperty(db, new PropertyPath("(FrameworkElement.RenderTransform).(TranslateTransform.X)"));
        //Storyboard.SetTargetProperty(db, new PropertyPath(TranslateTransform.XProperty));
        db.From = 0 - ElementPosition.X;
        db.To = 0;
    }
    else
    {
        Storyboard.SetTargetProperty(db, new PropertyPath("(FrameworkElement.RenderTransform).(TranslateTransform.Y)"));
        //Storyboard.SetTargetProperty(db, new PropertyPath(TranslateTransform.YProperty));
        db.From = 0 - ElementPosition.X;
        db.To = 0;
    }

    story.Children.Add(db);

    BeginStoryboard beginstoryboard = new BeginStoryboard();
    beginstoryboard.Storyboard = story;
    TranslateTransform oTransform = objInnerElement.RenderTransform as TranslateTransform;

    if (oTransform == null)
    {
        oTransform = new TranslateTransform();
        oTransform.X = 0;
        oTransform.Y = 0;
        objInnerElement.RenderTransform = oTransform;
    }

    if (objMoveIn.ddlDirection.SelectedIndex == 0)
        oTransform.BeginAnimation(TranslateTransform.XProperty, db);
    else
        oTransform.BeginAnimation(TranslateTransform.YProperty, db);

    Style objStyle = new Style();
    EventTrigger objEventTrigger = new EventTrigger(FrameworkElement.LoadedEvent);
    objEventTrigger.Actions.Add(beginstoryboard);
    objStyle.Triggers.Add(objEventTrigger);
    objInnerElement.Style = objStyle;
}

Анимация работает успешно, но моя проблема в том, что, когда я пытался сгенерировать XAML из этого элемента применяемого фреймворка

string shapestring = XamlWriter.Save(element);
StringReader stringReader = new StringReader(shapestring);
XmlTextReader xmlTextReader = new XmlTextReader(stringReader);
Element DeepCopyobject = (Element)XamlReader.Load(xmlTextReader);

выдает ошибку, как показано ниже:

{"Невозможно преобразовать строку 'RenderTransform. (TranslateTransform.X)' в атрибуте «TargetProperty» для объект типа 'System.Windows.PropertyPath. Путь свойства недействителен. Не могу разрешить имя типа 'TranslateTransform. Ошибка на объекте 'System.Windows.Media.Animation.DoubleAnimation',

Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 24 февраля 2011

Я не могу точно повторить проблему, но при наличии такой разметки:

    <Canvas x:Name="canvas"
            Grid.Row="1"
            Grid.ColumnSpan="3">
        <Rectangle Canvas.Left="10" Canvas.Top="10" Width="50"
                   Height="10"
                   RadiusX="5"
                   RadiusY="5"
                   Stroke="Black" Fill="AliceBlue" />

        <Rectangle Canvas.Left="30"
                   Canvas.Top="100"
                   Width="50"
                   Height="10"
                   RadiusX="5"
                   RadiusY="5"
                   Stroke="Black"
                   Fill="Blue" />

        <Rectangle Canvas.Left="200"
                   Canvas.Top="150"
                   Width="50"
                   Height="10"
                   RadiusX="5"
                   RadiusY="5"
                   Stroke="Black"
                   Fill="Green" />
    </Canvas>

и такой код:

       foreach (FrameworkElement objInnerElement in canvas.Children)
        {
            Point ElementPosition = new Point(Canvas.GetLeft(objInnerElement), Canvas.GetTop(objInnerElement));

            DoubleAnimation db = new DoubleAnimation();

            db.RepeatBehavior = RepeatBehavior.Forever;
            db.Duration = TimeSpan.FromSeconds(1000.0);

            Storyboard story = new Storyboard();
            Storyboard.SetTargetProperty(db, new PropertyPath("(FrameworkElement.RenderTransform).(TranslateTransform.X)"));
            db.From = 0 - ElementPosition.X;
            db.To = 0;

            story.Children.Add(db);

            BeginStoryboard beginstoryboard = new BeginStoryboard();
            beginstoryboard.Storyboard = story;
            TranslateTransform oTransform = objInnerElement.RenderTransform as TranslateTransform;

            if (oTransform == null)
            {
                oTransform = new TranslateTransform();
                oTransform.X = 0;
                oTransform.Y = 0;
                objInnerElement.RenderTransform = oTransform;
            }

            oTransform.BeginAnimation(TranslateTransform.XProperty, db);

            Style objStyle = new Style();
            EventTrigger objEventTrigger = new EventTrigger(FrameworkElement.LoadedEvent);
            objEventTrigger.Actions.Add(beginstoryboard);
            objStyle.Triggers.Add(objEventTrigger);
            objInnerElement.Style = objStyle;
        }

        string shapestring =  XamlWriter.Save(canvas);
        StringReader stringReader = new StringReader(shapestring);
        XmlTextReader xmlTextReader = new XmlTextReader(stringReader);
        UIElement DeepCopyobject = (UIElement)XamlReader.Load(xmlTextReader);

работает нормально, без ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...