65 lines
2.3 KiB
C#
65 lines
2.3 KiB
C#
using System;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using HandyControl.Tools;
|
|
|
|
namespace HandyControl.Controls
|
|
{
|
|
public class RunningBorder : Border
|
|
{
|
|
private bool _test;
|
|
|
|
protected override Size MeasureOverride(Size constraint)
|
|
{
|
|
if (_test)
|
|
{
|
|
_test = false;
|
|
return constraint;
|
|
}
|
|
|
|
var child = Child;
|
|
var borderThickness = BorderThickness;
|
|
var padding = Padding;
|
|
|
|
if (UseLayoutRounding)
|
|
{
|
|
var dpiScaleX = DpiHelper.DeviceDpiX;
|
|
var dpiScaleY = DpiHelper.DeviceDpiY;
|
|
|
|
borderThickness = new Thickness(
|
|
DpiHelper.RoundLayoutValue(borderThickness.Left, dpiScaleX),
|
|
DpiHelper.RoundLayoutValue(borderThickness.Top, dpiScaleY),
|
|
DpiHelper.RoundLayoutValue(borderThickness.Right, dpiScaleX),
|
|
DpiHelper.RoundLayoutValue(borderThickness.Bottom, dpiScaleY));
|
|
}
|
|
|
|
var borderSize = ConvertThickness2Size(borderThickness);
|
|
var paddingSize = ConvertThickness2Size(padding);
|
|
var mySize = new Size();
|
|
|
|
if (child != null)
|
|
{
|
|
var combined = new Size(borderSize.Width + paddingSize.Width, borderSize.Height + paddingSize.Height);
|
|
var borderConstraint = new Size(Math.Max(0.0, constraint.Width - combined.Width), Math.Max(0.0, constraint.Height - combined.Height));
|
|
var childConstraint = new Size(Math.Max(0.0, double.PositiveInfinity - combined.Width), Math.Max(0.0, double.PositiveInfinity - combined.Height));
|
|
|
|
|
|
child.Measure(borderConstraint);
|
|
var childSize = child.DesiredSize;
|
|
|
|
mySize.Width = childSize.Width + combined.Width;
|
|
mySize.Height = childSize.Height + combined.Height;
|
|
|
|
child.Measure(childConstraint);
|
|
}
|
|
else
|
|
{
|
|
mySize = new Size(borderSize.Width + paddingSize.Width, borderSize.Height + paddingSize.Height);
|
|
}
|
|
|
|
return mySize;
|
|
}
|
|
|
|
private static Size ConvertThickness2Size(Thickness th) => new Size(th.Left + th.Right, th.Top + th.Bottom);
|
|
}
|
|
} |