这是此帖Changing default line height in avalon edit的后续内容。由于你不能在那篇文章中提出问题,我不得不在新帖子上问同样的问题。这是彼得摩尔的帖子,他解释了如何增加线高。
我认为我已按照他的说法实现了它,但它似乎并没有增加实际编辑器文本的高度/位置,但确实增加了文本的位置和行号的高度。请看下面的图片。
关于如何修复编辑器文本高度的任何想法?
在TextView.cs中:
public static readonly DependencyProperty LineSpacingProperty =
DependencyProperty.Register("LineSpacing", typeof(double), typeof(TextView),
new FrameworkPropertyMetadata(1.0));
public double LineSpacing
{
get { return (double)GetValue(LineSpacingProperty); }
set { SetValue(LineSpacingProperty, value); }
}
在VisualLine.cs(VisualLine.SetTextLines)中:
internal void SetTextLines(List<TextLine> textLines)
{
this.textLines = textLines.AsReadOnly();
Height = 0;
TextView textView = new TextView();
foreach (TextLine line in textLines)
Height += (line.Height * textView.LineSpacing);
}
(VisualLine.GetTextLineVisualYPosition):
public double GetTextLineVisualYPosition(TextLine textLine, VisualYPosition yPositionMode)
{
TextView textView = new TextView();
if (textLine == null)
throw new ArgumentNullException("textLine");
double pos = VisualTop;
foreach (TextLine tl in TextLines)
{
if (tl == textLine)
{
switch (yPositionMode)
{
case VisualYPosition.LineTop:
return pos;
case VisualYPosition.LineMiddle:
return pos + (tl.Height * textView.LineSpacing) / 2;
case VisualYPosition.LineBottom:
return pos + (tl.Height * textView.LineSpacing);
case VisualYPosition.TextTop:
return pos + tl.Baseline - textView.DefaultBaseline;
case VisualYPosition.TextBottom:
return pos + tl.Baseline - textView.DefaultBaseline + textView.DefaultLineHeight;
case VisualYPosition.TextMiddle:
return pos + tl.Baseline - textView.DefaultBaseline + textView.DefaultLineHeight / 2;
case VisualYPosition.Baseline:
return pos + tl.Baseline;
default:
throw new ArgumentException("Invalid yPositionMode:" + yPositionMode);
}
}
else
{
pos += (tl.Height * textView.LineSpacing);
}
}
throw new ArgumentException("textLine is not a line in this VisualLine");
}
然后在(VisualLine.GetTextLineByVisualYPosition)中:
public TextLine GetTextLineByVisualYPosition(double visualTop)
{
TextView textView = new TextView();
const double epsilon = 0.0001;
double pos = this.VisualTop;
foreach (TextLine tl in TextLines)
{
pos += (tl.Height * textView.LineSpacing);
if (visualTop + epsilon < pos)
return tl;
}
return TextLines[TextLines.Count - 1];
}
最后在我的窗口类中:
textEditor.TextArea.TextView.LineSpacing = 3.5f;
此处更改时间距不起作用,但如果我在依赖项属性中直接更改它,则会起作用。此外,这只会更改行号和编辑器的行间距,但编辑器“文本”位置不变。我做错了吗?