Пример #1
0
        /// <summary>
        /// ClipBorder computes the position of its single child and applies its child's alignments to the child.
        /// 
        /// </summary>
        /// <param name="finalSize">The size reserved for this element by the parent</param>
        /// <returns>The actual ink area of the element, typically the same as finalSize</returns>
        protected override Size ArrangeOverride(Size finalSize)
        {
            var borders = BorderThickness;
            var boundRect = new Rect(finalSize);
            var innerRect = boundRect.Deflate(borders);
            var corners = CornerRadius;
            var padding = Padding;
            var childRect = innerRect.Deflate(padding);

            //  calculate border rendering geometry
            if (!boundRect.Width.IsZero() && !boundRect.Height.IsZero())
            {
                var outerBorderInfo = new BorderInfo(corners, borders, new Thickness(), true);
                var borderGeometry = new StreamGeometry();

                using (var ctx = borderGeometry.Open())
                {
                    GenerateGeometry(ctx, boundRect, outerBorderInfo);
                }
                // Freeze the geometry for better perfomance
                borderGeometry.Freeze();
                _borderGeometryCache = borderGeometry;
            }
            else
            {
                _borderGeometryCache = null;
            }

            //  calculate background rendering geometry
            if (!innerRect.Width.IsZero() && !innerRect.Height.IsZero())
            {
                var innerBorderInfo = new BorderInfo(corners, borders, new Thickness(), false);
                var backgroundGeometry = new StreamGeometry();

                using (var ctx = backgroundGeometry.Open())
                {
                    GenerateGeometry(ctx, innerRect, innerBorderInfo);
                }
                // Freeze the geometry for better perfomance
                backgroundGeometry.Freeze();
                _backgroundGeometryCache = backgroundGeometry;
            }
            else
            {
                _backgroundGeometryCache = null;
            }

            //  Arrange the Child and set its clip
            var child = Child;
            if (child != null)
            {
                child.Arrange(childRect);
                // Calculate the Clipping Geometry
                var clipGeometry = new StreamGeometry();
                var childBorderInfo = new BorderInfo(corners, borders, padding, false);
                using (var ctx = clipGeometry.Open())
                {
                    GenerateGeometry(ctx, new Rect(0, 0, childRect.Width, childRect.Height), childBorderInfo);
                }
                // Freeze the geometry for better perfomance
                clipGeometry.Freeze();
                // Apply the clip to the Child
                child.Clip = clipGeometry;
            }

            return finalSize;
        }