Я заметил, что моя пользовательская форма имеет верхнее поле ~ 9px (и левое поле 0.5px тоже).
Этов основном это класс, который расширяет Shape
, получая данный Text
и другие текстовые атрибуты, и создает фигуру с таким же размером.
Пытаясь понять, почему это поле было (нечто я хотел), я обнаружил, что FormattedText.BuildGeometry()
создает его.
_textGeometry = new FormattedText(Text ?? "", Thread.CurrentThread.CurrentUICulture,
FlowDirection.LeftToRight, new Typeface(FontFamily, FontStyle, FontWeight, FontStretch),
FontSize, Brushes.Black).BuildGeometry(Origin);
Текст: Ctrl + V
FontFamily: SegoeИнтерфейс пользователя
FontStyle: Обычный
FontWeight: Обычный
FontStretch: По умолчанию
Источник: Новая точка(0.5, 0.5)
Я знаю, как решить эту проблему, просто переопределив MeasureOverride
и применив Transform
, например:
protected override Size MeasureOverride(Size constraint)
{
var definingGeometry = DefiningGeometry;
var dashStyle = (DashStyle)null;
if (_pen != null)
{
dashStyle = _pen.DashStyle;
if (dashStyle != null)
_pen.DashStyle = null;
}
var renderBounds = definingGeometry.GetRenderBounds(_pen);
if (dashStyle != null)
_pen.DashStyle = dashStyle;
return new Size(Math.Max(renderBounds.Right - renderBounds.X, 0.0), Math.Max(renderBounds.Bottom - renderBounds.Y, 0.0));
}
Код, частично взятый отсюда.
protected override void OnRender(DrawingContext drawingContext)
{
_textGeometry.Transform = new TranslateTransform(-_textGeometry.Bounds.X, -_textGeometry.Bounds.Y);
//If the outline of the text should not be rendered outside, use the base OnRender method.
if (!UserSettings.All.DrawOutlineOutside)
{
base.OnRender(drawingContext);
return;
}
//This code will draw the outline outside the text.
drawingContext.DrawGeometry(null, _pen, _textGeometry);
drawingContext.DrawGeometry(Fill, null, _textGeometry);
}
Теперь, что касается того, почему эта геометрия имеет такой запас, у меня нет идей.Ты хоть представляешь, что происходит?