【问题标题】:Silverlight cannot update property after animation runs动画运行后 Silverlight 无法更新属性
【发布时间】:2010-03-03 16:09:04
【问题描述】:

我正在尝试使用 silverlight 4 创建一个简单的平移和缩放应用程序,但在更新 TranslateTransform 和 ScaleTransform 属性之后我在它们上运行动画时遇到了问题。

我尝试将 FillBehaviour 设置为 Stop,但没有成功。

这是我的代码:

<Canvas x:Name="LayoutRoot" Background="White" Width="800" Height="600">
        <Canvas x:Name="PanningCanvas" Height="600" Width="800">
            <Canvas.RenderTransform>
                <TransformGroup>
                    <ScaleTransform x:Name="CanvasScale"/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform x:Name="CanvasTransform"/>
                </TransformGroup>
            </Canvas.RenderTransform>
            <Rectangle x:Name="MovingRect" Fill="#FF834040" Height="209" Canvas.Left="219" Stroke="#FF500505" Canvas.Top="220" Width="329" StrokeThickness="2"/>
        </Canvas>
        <Button Content="Animate" Width="107" Canvas.Left="38" Canvas.Top="46" ClickMode="Press" Click="Button_Click"/>
    </Canvas>

这是所有背后的 C#(略略缩写)

public partial class MainPage : UserControl
    {
        private ManipulationProcessor2D manipulationProcessor;

        public MainPage()
        {
            InitializeComponent();

            this.manipulationProcessor = new ManipulationProcessor2D(Manipulations2D.Translate | Manipulations2D.Scale);

            this.manipulationProcessor.Delta += OnManipulationDelta;

            Touch.FrameReported += OnCapturedTouchReported;
        }

        private void OnManipulationDelta(object sender, Manipulation2DDeltaEventArgs e)
        {
            float zoomVal = e.Delta.ScaleX;
            Point pinchPoint = new Point(e.OriginX, e.OriginY);

            float xTranslation = e.Delta.TranslationX;
            float yTranslation = e.Delta.TranslationY;

            if (zoomVal != 1.0)
            {
                Zoom(zoomVal, PanningCanvas.RenderTransform.Inverse.Transform(pinchPoint), pinchPoint, xTranslation, yTranslation, true);
            }
            else if (xTranslation != 0 || yTranslation != 0)
            {
                Translate(xTranslation, yTranslation);
            }
        }

        public void Zoom(double zoom, Point pinchPosition, Point physicalPosition, float xTranslation, float yTranslation, bool isFinger)
        {
            if (isFinger)
            {
                CanvasScale.ScaleX = CanvasScale.ScaleX * zoom;
                CanvasScale.ScaleY = CanvasScale.ScaleY * zoom;

                CanvasTransform.X = -1 * (pinchPosition.X * CanvasScale.ScaleX - physicalPosition.X);
                CanvasTransform.Y = -1 * (pinchPosition.Y * CanvasScale.ScaleY - physicalPosition.Y);
            }
            else
            {
                CanvasScale.ScaleX = CanvasScale.ScaleX + zoom;
                CanvasScale.ScaleY = CanvasScale.ScaleY + zoom;
            }
        }

        private void Translate(float xTranslation, float yTranslation)
        {
            CanvasTransform.X += xTranslation;
            CanvasTransform.Y += yTranslation;
        }

        private void OnCapturedTouchReported(object sender, TouchFrameEventArgs e)
        {
            //..removed..//

            // process manipulations
            this.manipulationProcessor.ProcessManipulators(DateTime.UtcNow.Ticks,manipulators);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            AnimatePosition(new Point(400, 300), 1);
            AnimateScale(1.2, 1);
        }

        private Storyboard translateStoryboard = new Storyboard();
        private Storyboard scaleStoryboard = new Storyboard();

        public void AnimatePosition(Point destinationPoint, double lengthOfAnimation)
        {
            Point offset = new Point(destinationPoint.X, destinationPoint.Y);

            var translationAnimationX = new DoubleAnimation() { SpeedRatio = 1, Duration = new Duration(TimeSpan.FromSeconds(lengthOfAnimation)), To = offset.X };
            translateStoryboard.Children.Add(translationAnimationX);

            Storyboard.SetTargetProperty(translationAnimationX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"));

            var translationAnimationY = new DoubleAnimation() { SpeedRatio = 1, Duration = new Duration(TimeSpan.FromSeconds(lengthOfAnimation)), To = offset.Y };
            translateStoryboard.Children.Add(translationAnimationY);

            Storyboard.SetTargetProperty(translationAnimationY, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)"));
            Storyboard.SetTarget(translateStoryboard, PanningCanvas);

            translateStoryboard.Begin();
        }

        public void AnimateScale( double scale, double lengthOfAnimation)
        {
            var scaleAnimationX = new DoubleAnimation() { SpeedRatio = 1, Duration = new Duration(TimeSpan.FromSeconds(lengthOfAnimation)), To = scale };
            scaleStoryboard.Children.Add(scaleAnimationX);

            Storyboard.SetTargetProperty(scaleAnimationX, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"));

            var scaleAnimationY = new DoubleAnimation() { SpeedRatio = 1, Duration = new Duration(TimeSpan.FromSeconds(lengthOfAnimation)), To = scale };
            scaleStoryboard.Children.Add(scaleAnimationY);

            Storyboard.SetTargetProperty(scaleAnimationY, new PropertyPath("(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"));
            Storyboard.SetTarget(scaleStoryboard, PanningCanvas);

            scaleStoryboard.Begin();
        }
    }

问题是点击按钮后,我无法再翻译或缩放...

请帮忙!

标记

【问题讨论】:

    标签: silverlight xaml animation


    【解决方案1】:

    好的,所以我让它工作了,但我不知道为什么。

    将动画更改为这样工作:

            Storyboard translateStoryboard = new Storyboard();
            Point offset = new Point(destinationPoint.X, destinationPoint.Y);
    
            var translationAnimationX = new DoubleAnimation() { SpeedRatio = 1, Duration = new Duration(TimeSpan.FromSeconds(lengthOfAnimation)), To = offset.X };
            var translationAnimationY = new DoubleAnimation() { SpeedRatio = 1, Duration = new Duration(TimeSpan.FromSeconds(lengthOfAnimation)), To = offset.Y };
    
            Storyboard.SetTargetProperty(translationAnimationX, new PropertyPath("X"));
            Storyboard.SetTargetProperty(translationAnimationY, new PropertyPath("Y"));
    
            Storyboard.SetTargetName(translationAnimationX, "CanvasTransform");
            Storyboard.SetTargetName(translationAnimationY, "CanvasTransform");
    
            translateStoryboard.Children.Add(translationAnimationX);
            translateStoryboard.Children.Add(translationAnimationY);
    
            translateStoryboard.Begin();
    

    成功了,但我不知道为什么......

    谁能给我解释一下?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-13
      • 2023-04-08
      • 1970-01-01
      • 2013-07-02
      • 2014-03-11
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      相关资源
      最近更新 更多