很怀念windows forms当中的AutoSize属性啊,但可惜的是WPF并没有实现这个属性,这多少让人有些郁闷。
那就自个写吧,相对比较容易的是TextBox之类的仅仅显示平文本的控件,你 可以根据你的文本,字体等等属性构造一个FormattedText
实例,这个实例有Width/Height属性(我还是很怀念Font.MeasureString方 法),最让人纠结的是RichTextBox控件,哎,又是它。
思路很简单,监视文本变化,文本变化时调整控件大小:
protected override void OnTextChanged(TextChangedEventArgs e)
{
base.OnTextChanged(e);
AdjustSizeByConent();
}
public void AdjustSizeByConent()
{
//myHeight = ... 取得正确的高度
Height = myHeight;
//myWidth = ... 取得正确的宽度
Width = myWidth;
}
如何获取正确的高度呢,有一个非常捡便宜的方法,分别对 Document.ContentStart和Document.ContentEnd调用 TextPointer.GetCharacterRect()方法,我们可以获得文档开始处和结束处的内 容边框,如下图所示:
注意到两个红色边框了吗,用第二个边框的bottom减去第一个边框的top,就 可以得到内容的高度,所以:
Rect rectStart = Document.ContentStart.GetCharacterRect (LogicalDirection.Forward);
Rect rectEnd = Document.ContentEnd.GetCharacterRect(LogicalDirection.Forward);
var height = rectEnd.Bottom - rectStart.Top;
var remainH = rectEnd.Height/2.0;
Height = Math.Min(MaxHeight, Math.Max (MinHeight, height + remainH));
(代码中的remainH 是预留的一点点空白)