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); }