protected override void ApplyScale(Vector scale, Point center)
        {
            Dictionary <SceneElement, Size> dictionary = this.CalculateClampedSizes(ref scale);
            Vector          vector1 = new Vector(scale.X < 0.0 ? -1.0 : 1.0, scale.Y < 0.0 ? -1.0 : 1.0);
            Matrix          startSharedTransform = this.StartSharedTransform;
            Matrix          inverseMatrix        = ElementUtilities.GetInverseMatrix(startSharedTransform);
            ILayoutDesigner designerForChild     = this.ActiveSceneViewModel.GetLayoutDesignerForChild(this.EditingElementSet.PrimaryElement, true);

            foreach (SceneElement index in this.EditingElementSet.Elements)
            {
                double width  = dictionary[index].Width;
                double height = dictionary[index].Height;
                Rect   rect1  = this.StartBoundsDictionary[index];
                Point  renderTransformOrigin = ((Base2DElement)index).RenderTransformOrigin;
                Point  point1  = new Point(rect1.X + rect1.Width * renderTransformOrigin.X, rect1.Y + rect1.Height * renderTransformOrigin.Y);
                Matrix matrix1 = this.ElementToElementsTransformDictionary[index];
                Matrix matrix2 = new Matrix();
                matrix2.Translate(-center.X, -center.Y);
                matrix1 *= matrix2;
                Point  point2  = matrix1.Transform(point1);
                Vector vector2 = new Point(point2.X * scale.X, point2.Y * scale.Y) - point2;
                Vector vector3 = new Vector((width - rect1.Width) * renderTransformOrigin.X, (height - rect1.Height) * renderTransformOrigin.Y);
                Vector vector4 = vector2 * startSharedTransform - vector3;
                Matrix matrix3 = this.StartTransformsDictionary[index];
                Matrix m       = new Matrix();
                m.Scale(scale.X, scale.Y);
                Matrix matrix4 = ElementUtilities.GetInverseMatrix(m) * matrix3 * inverseMatrix;
                Vector vector5 = new Vector(matrix3.OffsetX, matrix3.OffsetY) * inverseMatrix;
                matrix4.ScaleAt(scale.X, scale.Y, vector5.X, vector5.Y);
                CanonicalDecomposition newTransform = new CanonicalDecomposition(matrix4 * startSharedTransform);
                newTransform.ScaleX      *= vector1.X;
                newTransform.ScaleY      *= vector1.Y;
                newTransform.Translation += vector4;
                AdornedToolBehavior.UpdateElementTransform(index, newTransform, AdornedToolBehavior.TransformPropertyFlags.Scale | AdornedToolBehavior.TransformPropertyFlags.Skew | AdornedToolBehavior.TransformPropertyFlags.RotatationAngle);
                Rect rect2 = this.initialRects[index];
                rect2.Offset(newTransform.TranslationX - this.initialTransforms[index].TranslationX, newTransform.TranslationY - this.initialTransforms[index].TranslationY);
                rect2.Width  = width;
                rect2.Height = height;
                BaseFrameworkElement child             = (BaseFrameworkElement)index;
                LayoutOverrides      overridesToIgnore = (LayoutOverrides)(0 | (!object.Equals((object)width, (object)rect1.Width) ? 16 : 0) | (!object.Equals((object)height, (object)rect1.Height) ? 32 : 0));
                designerForChild.SetChildRect(child, rect2, this.initialOverrides[index], overridesToIgnore, LayoutOverrides.None);
                if (!object.Equals((object)width, (object)rect1.Width) || !object.Equals((object)height, (object)rect1.Height))
                {
                    PathElement.EnsureStretchIsFill((SceneNode)index);
                }
                PathElement.PathTransformHelper pathTransformHelper;
                if (this.pathTransformHelpers.TryGetValue(index, out pathTransformHelper))
                {
                    pathTransformHelper.Update(scale.X * vector1.X, scale.Y * vector1.Y);
                }
            }
        }
示例#2
0
        protected override void ApplyScale(Vector scale, Point center)
        {
            Vector             scale1             = new Vector(Math.Abs(scale.X), Math.Abs(scale.Y));
            Vector             scale2             = new Vector(scale.X < 0.0 ? -1.0 : 1.0, scale.Y < 0.0 ? -1.0 : 1.0);
            Vector             vector1            = new Vector(this.StartCenter.X, this.StartCenter.Y);
            Size               newSize            = this.ComputeNewSize(scale1);
            Point              topLeft            = this.StartBounds.TopLeft;
            CanonicalTransform canonicalTransform = new CanonicalTransform(this.StartTransform);

            canonicalTransform.ApplyScale(scale, this.StartCenter, center);
            Point point1 = (topLeft - vector1) * canonicalTransform.TransformGroup.Value + vector1;
            Point renderTransformOrigin = this.BaseEditingElement.RenderTransformOrigin;

            renderTransformOrigin.X *= newSize.Width;
            renderTransformOrigin.Y *= newSize.Height;
            CanonicalTransform newTransform = new CanonicalTransform(this.StartTransform);

            newTransform.ApplyScale(scale2, renderTransformOrigin, center);
            Vector vector2 = (Vector)renderTransformOrigin;
            Point  point2  = (topLeft - vector2) * newTransform.TransformGroup.Value + vector2;

            newTransform.Translation += point1 - point2;
            AdornedToolBehavior.UpdateElementTransform(this.EditingElement, newTransform, AdornedToolBehavior.TransformPropertyFlags.Scale);
            ILayoutDesigner designerForChild = this.ActiveSceneViewModel.GetLayoutDesignerForChild(this.EditingElement, true);
            Rect            rect             = this.initialRect;

            rect.Offset(newTransform.TranslationX - this.StartTransform.TranslationX, newTransform.TranslationY - this.StartTransform.TranslationY);
            rect.Width  = newSize.Width;
            rect.Height = newSize.Height;
            LayoutOverrides overridesToIgnore = (LayoutOverrides)(0 | (!object.Equals((object)rect.Width, (object)this.StartSize.Width) ? 16 : 0) | (!object.Equals((object)rect.Height, (object)this.StartSize.Height) ? 32 : 0));

            designerForChild.SetChildRect(this.BaseEditingElement, rect, this.initialOverrides, overridesToIgnore, LayoutOverrides.None);
            if (!object.Equals((object)rect.Width, (object)this.StartSize.Width) || !object.Equals((object)rect.Height, (object)this.StartSize.Height))
            {
                PathElement.EnsureStretchIsFill((SceneNode)this.EditingElement);
            }
            if (this.transformHelper == null)
            {
                return;
            }
            this.transformHelper.Update(scale1.X, scale1.Y);
        }