Exemplo n.º 1
0
        private Line CreateAnchor(UIElement element, double x, double y)
        {
            var anchor = new Line()
            {
                X1 = 0,
                Y1 = 0,
                X2 = 80,
                Y2 = 0
            };

            SetAnchorProperties(anchor);

            var anchorVisual  = ElementCompositionPreview.GetElementVisual(anchor);
            var elementVisual = ElementCompositionPreview.GetElementVisual(element);
            var centerVisual  = ElementCompositionPreview.GetElementVisual(_centerContent);
            var elementNode   = elementVisual.GetReference();
            var centerNode    = centerVisual.GetReference();

            ScalarNode expression;
            var        elementY = elementNode.Offset.Y + (elementNode.Size.Y / 2);
            var        centerY  = centerNode.Offset.Y + (centerNode.Size.Y / 2);
            var        elementX = elementNode.Offset.X + (elementNode.Size.X / 2);
            var        centerX  = centerNode.Offset.X + (centerNode.Size.X / 2);

            var startingAngle = Math.Atan2(y, x);

            if (startingAngle > Math.PI / 4 && startingAngle < 3 * Math.PI / 4)
            {
                expression = ExpressionFunctions.ATan((-1 * (elementX - centerX)) / (elementY - centerY)) - ((float)Math.PI / 2.0f);
            }
            else if (startingAngle >= 3 * Math.PI / 4 || startingAngle < -3 * Math.PI / 4)
            {
                expression = ExpressionFunctions.ATan((elementY - centerY) / (elementX - centerX)) + (float)Math.PI;
            }
            else if (startingAngle >= -3 * Math.PI / 4 && startingAngle < Math.PI / -4)
            {
                expression = ExpressionFunctions.ATan((elementX - centerX) / (-1 * (elementY - centerY))) + ((float)Math.PI / 2.0f);
            }
            else
            {
                expression = ExpressionFunctions.ATan((elementY - centerY) / (elementX - centerX));
            }

            anchorVisual.CenterPoint = new Vector3(0);
            anchorVisual.StartAnimation(nameof(anchorVisual.RotationAngle), expression);

            var offsetExpression = ExpressionFunctions.Vector3(centerNode.Offset.X + (centerNode.Size.X / 2), centerNode.Offset.Y + (centerNode.Size.Y / 2), 0);

            anchorVisual.StartAnimation(nameof(anchorVisual.Offset), offsetExpression);

            var scaleExpression = ExpressionFunctions.Vector3(ExpressionFunctions.Pow(ExpressionFunctions.Pow(elementX - centerX, 2) + ExpressionFunctions.Pow(elementY - centerY, 2), 0.5f) / 80, 1, 1);

            anchorVisual.StartAnimation(nameof(anchorVisual.Scale), scaleExpression);

            return(anchor);
        }