private void SetLayoutOffset(Vector offset, Size oldRenderSize) { if (!this.AreTransformsClean || !DoubleUtil.AreClose(this.RenderSize, oldRenderSize)) { Transform directionTransform = this.GetFlowDirectionTransform(); Transform transform = this.RenderTransform; if (transform == Transform.Identity) transform = (Transform) null; FrameworkElement.LayoutTransformData layoutTransformData = FrameworkElement.LayoutTransformDataField.GetValue((DependencyObject) this); TransformGroup transformGroup = (TransformGroup) null; if (directionTransform != null || transform != null || layoutTransformData != null) { transformGroup = new TransformGroup(); transformGroup.CanBeInheritanceContext = false; transformGroup.Children.CanBeInheritanceContext = false; if (directionTransform != null) transformGroup.Children.Add(directionTransform); if (layoutTransformData != null) { transformGroup.Children.Add(layoutTransformData.Transform); FrameworkElement.MinMax minMax = new FrameworkElement.MinMax(this); Size renderSize = this.RenderSize; if (double.IsPositiveInfinity(minMax.maxWidth)) { double width = renderSize.Width; } if (double.IsPositiveInfinity(minMax.maxHeight)) { double height = renderSize.Height; } renderSize.Width = Math.Min(renderSize.Width, minMax.maxWidth); renderSize.Height = Math.Min(renderSize.Height, minMax.maxHeight); Rect rect = Rect.Transform(new Rect(renderSize), layoutTransformData.Transform.Value); transformGroup.Children.Add((Transform) new TranslateTransform(-rect.X, -rect.Y)); } if (transform != null) { Point renderTransformOrigin = this.GetRenderTransformOrigin(); bool flag = renderTransformOrigin.X != 0.0 || renderTransformOrigin.Y != 0.0; if (flag) { TranslateTransform translateTransform = new TranslateTransform(-renderTransformOrigin.X, -renderTransformOrigin.Y); translateTransform.Freeze(); transformGroup.Children.Add((Transform) translateTransform); } transformGroup.Children.Add(transform); if (flag) { TranslateTransform translateTransform = new TranslateTransform(renderTransformOrigin.X, renderTransformOrigin.Y); translateTransform.Freeze(); transformGroup.Children.Add((Transform) translateTransform); } } } this.VisualTransform = (Transform) transformGroup; this.AreTransformsClean = true; } Vector visualOffset = this.VisualOffset; if (DoubleUtil.AreClose(visualOffset.X, offset.X) && DoubleUtil.AreClose(visualOffset.Y, offset.Y)) return; this.VisualOffset = offset; }
protected override Geometry GetLayoutClip(Size layoutSlotSize) { bool useLayoutRounding = this.UseLayoutRounding; if (useLayoutRounding && !this.CheckFlagsAnd(VisualFlags.UseLayoutRounding)) this.SetFlags(true, VisualFlags.UseLayoutRounding); if (!this.NeedsClipBounds && !this.ClipToBounds) return base.GetLayoutClip(layoutSlotSize); FrameworkElement.MinMax minMax = new FrameworkElement.MinMax(this); Size renderSize = this.RenderSize; double width = double.IsPositiveInfinity(minMax.maxWidth) ? renderSize.Width : minMax.maxWidth; double height = double.IsPositiveInfinity(minMax.maxHeight) ? renderSize.Height : minMax.maxHeight; bool flag1 = this.ClipToBounds || (DoubleUtil.LessThan(width, renderSize.Width) || DoubleUtil.LessThan(height, renderSize.Height)); renderSize.Width = Math.Min(renderSize.Width, minMax.maxWidth); renderSize.Height = Math.Min(renderSize.Height, minMax.maxHeight); FrameworkElement.LayoutTransformData layoutTransformData = FrameworkElement.LayoutTransformDataField.GetValue((DependencyObject) this); Rect rect1 = new Rect(); if (layoutTransformData != null) { rect1 = Rect.Transform(new Rect(0.0, 0.0, renderSize.Width, renderSize.Height), layoutTransformData.Transform.Value); renderSize.Width = rect1.Width; renderSize.Height = rect1.Height; } Thickness margin = this.Margin; double num1 = margin.Left + margin.Right; double num2 = margin.Top + margin.Bottom; Size clientSize = new Size(Math.Max(0.0, layoutSlotSize.Width - num1), Math.Max(0.0, layoutSlotSize.Height - num2)); bool flag2 = this.ClipToBounds || DoubleUtil.LessThan(clientSize.Width, renderSize.Width) || DoubleUtil.LessThan(clientSize.Height, renderSize.Height); Transform directionTransform = this.GetFlowDirectionTransform(); if (flag1 && !flag2) { Rect rect2 = new Rect(0.0, 0.0, width, height); if (useLayoutRounding) rect2 = UIElement.RoundLayoutRect(rect2, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); RectangleGeometry rectangleGeometry = new RectangleGeometry(rect2); if (directionTransform != null) rectangleGeometry.Transform = directionTransform; return (Geometry) rectangleGeometry; } else { if (!flag2) return (Geometry) null; Vector alignmentOffset = this.ComputeAlignmentOffset(clientSize, renderSize); if (layoutTransformData != null) { Rect rect2 = new Rect(-alignmentOffset.X + rect1.X, -alignmentOffset.Y + rect1.Y, clientSize.Width, clientSize.Height); if (useLayoutRounding) rect2 = UIElement.RoundLayoutRect(rect2, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); RectangleGeometry rectangleGeometry = new RectangleGeometry(rect2); Matrix matrix = layoutTransformData.Transform.Value; if (matrix.HasInverse) { matrix.Invert(); rectangleGeometry.Transform = (Transform) new MatrixTransform(matrix); } if (flag1) { Rect rect3 = new Rect(0.0, 0.0, width, height); if (useLayoutRounding) rect3 = UIElement.RoundLayoutRect(rect3, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); PathGeometry pathGeometry = Geometry.Combine((Geometry) new RectangleGeometry(rect3), (Geometry) rectangleGeometry, GeometryCombineMode.Intersect, (Transform) null); if (directionTransform != null) pathGeometry.Transform = directionTransform; return (Geometry) pathGeometry; } else { if (directionTransform != null) { if (rectangleGeometry.Transform != null) rectangleGeometry.Transform = (Transform) new MatrixTransform(rectangleGeometry.Transform.Value * directionTransform.Value); else rectangleGeometry.Transform = directionTransform; } return (Geometry) rectangleGeometry; } } else { Rect rect2 = new Rect(-alignmentOffset.X + rect1.X, -alignmentOffset.Y + rect1.Y, clientSize.Width, clientSize.Height); if (useLayoutRounding) rect2 = UIElement.RoundLayoutRect(rect2, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); if (flag1) { Rect rect3 = new Rect(0.0, 0.0, width, height); if (useLayoutRounding) rect3 = UIElement.RoundLayoutRect(rect3, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); rect2.Intersect(rect3); } RectangleGeometry rectangleGeometry = new RectangleGeometry(rect2); if (directionTransform != null) rectangleGeometry.Transform = directionTransform; return (Geometry) rectangleGeometry; } } }
protected override sealed Size MeasureCore(Size availableSize) { bool useLayoutRounding = this.UseLayoutRounding; if (useLayoutRounding && !this.CheckFlagsAnd(VisualFlags.UseLayoutRounding)) this.SetFlags(true, VisualFlags.UseLayoutRounding); this.ApplyTemplate(); if (this.BypassLayoutPolicies) return this.MeasureOverride(availableSize); Thickness margin = this.Margin; double num1 = margin.Left + margin.Right; double num2 = margin.Top + margin.Bottom; if (useLayoutRounding && this is ScrollContentPresenter) { num1 = UIElement.RoundLayoutValue(num1, FrameworkElement.DpiScaleX); num2 = UIElement.RoundLayoutValue(num2, FrameworkElement.DpiScaleY); } Size size1 = new Size(Math.Max(availableSize.Width - num1, 0.0), Math.Max(availableSize.Height - num2, 0.0)); FrameworkElement.MinMax minMax = new FrameworkElement.MinMax(this); FrameworkElement.LayoutTransformData layoutTransformData = FrameworkElement.LayoutTransformDataField.GetValue((DependencyObject) this); Transform layoutTransform = this.LayoutTransform; if (layoutTransform != null && !layoutTransform.IsIdentity) { if (layoutTransformData == null) { layoutTransformData = new FrameworkElement.LayoutTransformData(); FrameworkElement.LayoutTransformDataField.SetValue((DependencyObject) this, layoutTransformData); } layoutTransformData.CreateTransformSnapshot(layoutTransform); layoutTransformData.UntransformedDS = new Size(); if (useLayoutRounding) layoutTransformData.TransformedUnroundedDS = new Size(); } else if (layoutTransformData != null) { layoutTransformData = (FrameworkElement.LayoutTransformData) null; FrameworkElement.LayoutTransformDataField.ClearValue((DependencyObject) this); } if (layoutTransformData != null) size1 = this.FindMaximalAreaLocalSpaceRect(layoutTransformData.Transform, size1); size1.Width = Math.Max(minMax.minWidth, Math.Min(size1.Width, minMax.maxWidth)); size1.Height = Math.Max(minMax.minHeight, Math.Min(size1.Height, minMax.maxHeight)); if (useLayoutRounding) size1 = UIElement.RoundLayoutSize(size1, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); Size size2 = this.MeasureOverride(size1); size2 = new Size(Math.Max(size2.Width, minMax.minWidth), Math.Max(size2.Height, minMax.minHeight)); Size size3 = size2; if (layoutTransformData != null) { layoutTransformData.UntransformedDS = size3; Rect rect = Rect.Transform(new Rect(0.0, 0.0, size3.Width, size3.Height), layoutTransformData.Transform.Value); size3.Width = rect.Width; size3.Height = rect.Height; } bool flag = false; if (size2.Width > minMax.maxWidth) { size2.Width = minMax.maxWidth; flag = true; } if (size2.Height > minMax.maxHeight) { size2.Height = minMax.maxHeight; flag = true; } if (layoutTransformData != null) { Rect rect = Rect.Transform(new Rect(0.0, 0.0, size2.Width, size2.Height), layoutTransformData.Transform.Value); size2.Width = rect.Width; size2.Height = rect.Height; } double val2_1 = size2.Width + num1; double val2_2 = size2.Height + num2; if (val2_1 > availableSize.Width) { val2_1 = availableSize.Width; flag = true; } if (val2_2 > availableSize.Height) { val2_2 = availableSize.Height; flag = true; } if (layoutTransformData != null) layoutTransformData.TransformedUnroundedDS = new Size(Math.Max(0.0, val2_1), Math.Max(0.0, val2_2)); if (useLayoutRounding) { val2_1 = UIElement.RoundLayoutValue(val2_1, FrameworkElement.DpiScaleX); val2_2 = UIElement.RoundLayoutValue(val2_2, FrameworkElement.DpiScaleY); } SizeBox sizeBox1 = FrameworkElement.UnclippedDesiredSizeField.GetValue((DependencyObject) this); if (flag || val2_1 < 0.0 || val2_2 < 0.0) { if (sizeBox1 == null) { SizeBox sizeBox2 = new SizeBox(size3); FrameworkElement.UnclippedDesiredSizeField.SetValue((DependencyObject) this, sizeBox2); } else { sizeBox1.Width = size3.Width; sizeBox1.Height = size3.Height; } } else if (sizeBox1 != null) FrameworkElement.UnclippedDesiredSizeField.ClearValue((DependencyObject) this); return new Size(Math.Max(0.0, val2_1), Math.Max(0.0, val2_2)); }
protected override sealed void ArrangeCore(Rect finalRect) { bool useLayoutRounding = this.UseLayoutRounding; FrameworkElement.LayoutTransformData layoutTransformData = FrameworkElement.LayoutTransformDataField.GetValue((DependencyObject) this); Size size1 = Size.Empty; if (useLayoutRounding && !this.CheckFlagsAnd(VisualFlags.UseLayoutRounding)) this.SetFlags(true, VisualFlags.UseLayoutRounding); if (this.BypassLayoutPolicies) { Size renderSize = this.RenderSize; this.RenderSize = this.ArrangeOverride(finalRect.Size); this.SetLayoutOffset(new Vector(finalRect.X, finalRect.Y), renderSize); } else { this.NeedsClipBounds = false; Size size2 = finalRect.Size; Thickness margin = this.Margin; double num1 = margin.Left + margin.Right; double num2 = margin.Top + margin.Bottom; size2.Width = Math.Max(0.0, size2.Width - num1); size2.Height = Math.Max(0.0, size2.Height - num2); if (useLayoutRounding && layoutTransformData != null) { Size size3 = layoutTransformData.TransformedUnroundedDS; size1 = layoutTransformData.TransformedUnroundedDS; size1.Width = Math.Max(0.0, size1.Width - num1); size1.Height = Math.Max(0.0, size1.Height - num2); } SizeBox sizeBox = FrameworkElement.UnclippedDesiredSizeField.GetValue((DependencyObject) this); Size size4; if (sizeBox == null) { size4 = new Size(Math.Max(0.0, this.DesiredSize.Width - num1), Math.Max(0.0, this.DesiredSize.Height - num2)); if (size1 != Size.Empty) { size4.Width = Math.Max(size1.Width, size4.Width); size4.Height = Math.Max(size1.Height, size4.Height); } } else size4 = new Size(sizeBox.Width, sizeBox.Height); if (DoubleUtil.LessThan(size2.Width, size4.Width)) { this.NeedsClipBounds = true; size2.Width = size4.Width; } if (DoubleUtil.LessThan(size2.Height, size4.Height)) { this.NeedsClipBounds = true; size2.Height = size4.Height; } if (this.HorizontalAlignment != HorizontalAlignment.Stretch) size2.Width = size4.Width; if (this.VerticalAlignment != VerticalAlignment.Stretch) size2.Height = size4.Height; if (layoutTransformData != null) { Size areaLocalSpaceRect = this.FindMaximalAreaLocalSpaceRect(layoutTransformData.Transform, size2); size2 = areaLocalSpaceRect; size4 = layoutTransformData.UntransformedDS; if (!DoubleUtil.IsZero(areaLocalSpaceRect.Width) && !DoubleUtil.IsZero(areaLocalSpaceRect.Height) && (LayoutDoubleUtil.LessThan(areaLocalSpaceRect.Width, size4.Width) || LayoutDoubleUtil.LessThan(areaLocalSpaceRect.Height, size4.Height))) size2 = size4; if (DoubleUtil.LessThan(size2.Width, size4.Width)) { this.NeedsClipBounds = true; size2.Width = size4.Width; } if (DoubleUtil.LessThan(size2.Height, size4.Height)) { this.NeedsClipBounds = true; size2.Height = size4.Height; } } FrameworkElement.MinMax minMax = new FrameworkElement.MinMax(this); double num3 = Math.Max(size4.Width, minMax.maxWidth); if (DoubleUtil.LessThan(num3, size2.Width)) { this.NeedsClipBounds = true; size2.Width = num3; } double num4 = Math.Max(size4.Height, minMax.maxHeight); if (DoubleUtil.LessThan(num4, size2.Height)) { this.NeedsClipBounds = true; size2.Height = num4; } if (useLayoutRounding) size2 = UIElement.RoundLayoutSize(size2, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); Size renderSize = this.RenderSize; Size size5 = this.ArrangeOverride(size2); this.RenderSize = size5; if (useLayoutRounding) this.RenderSize = UIElement.RoundLayoutSize(this.RenderSize, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); Size size6 = new Size(Math.Min(size5.Width, minMax.maxWidth), Math.Min(size5.Height, minMax.maxHeight)); if (useLayoutRounding) size6 = UIElement.RoundLayoutSize(size6, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); FrameworkElement frameworkElement1 = this; int num5 = (frameworkElement1.NeedsClipBounds ? 1 : 0) | (DoubleUtil.LessThan(size6.Width, size5.Width) ? 1 : (DoubleUtil.LessThan(size6.Height, size5.Height) ? 1 : 0)); frameworkElement1.NeedsClipBounds = num5 != 0; if (layoutTransformData != null) { Rect rect = Rect.Transform(new Rect(0.0, 0.0, size6.Width, size6.Height), layoutTransformData.Transform.Value); size6.Width = rect.Width; size6.Height = rect.Height; if (useLayoutRounding) size6 = UIElement.RoundLayoutSize(size6, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); } Size size7 = new Size(Math.Max(0.0, finalRect.Width - num1), Math.Max(0.0, finalRect.Height - num2)); if (useLayoutRounding) size7 = UIElement.RoundLayoutSize(size7, FrameworkElement.DpiScaleX, FrameworkElement.DpiScaleY); FrameworkElement frameworkElement2 = this; int num6 = (frameworkElement2.NeedsClipBounds ? 1 : 0) | (DoubleUtil.LessThan(size7.Width, size6.Width) ? 1 : (DoubleUtil.LessThan(size7.Height, size6.Height) ? 1 : 0)); frameworkElement2.NeedsClipBounds = num6 != 0; Vector alignmentOffset = this.ComputeAlignmentOffset(size7, size6); alignmentOffset.X += finalRect.X + margin.Left; alignmentOffset.Y += finalRect.Y + margin.Top; if (useLayoutRounding) { alignmentOffset.X = UIElement.RoundLayoutValue(alignmentOffset.X, FrameworkElement.DpiScaleX); alignmentOffset.Y = UIElement.RoundLayoutValue(alignmentOffset.Y, FrameworkElement.DpiScaleY); } this.SetLayoutOffset(alignmentOffset, renderSize); } }