WPF中根据文本内容自动设置大小的RichTextBox

很怀念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 是预留的一点点空白)

时间: 2024-08-03 02:13:17

WPF中根据文本内容自动设置大小的RichTextBox的相关文章

Android开发之文本内容自动朗读功能实现方法

本文实例讲述了Android开发之文本内容自动朗读功能实现方法.分享给大家供大家参考,具体如下: Android提供了自动朗读支持.自动朗读支持可以对指定文本内容进行朗读,从而发生声音:不仅如此,Android的自动朗读支持还允许把文本对应的音频录制成音频文件,方便以后播放.这种自动朗读支持的英文名称为TextToSpeech,简称TTS. 借助于TTS的支持,可以在应用程序中动态地增加音频输出,从而改善用户体验. Android的自动朗读支持主要通过TextTospeech来完成,该累提供了如

如何在PowerPoint2013中添加文本框和设置文本

  在PowerPoint中输入文本也是我们常用的,那么,我们应该怎么输入和设置文本呢?下面,我们就一起来学习一下在PowerPoint2013中添加文本框和设置文本的方法. 操作步骤 1.用PowerPoint2013打开一篇文稿,并选择我们需要插入文本框的页,切换到"插入"选项卡,我们现在单击"文本"选项组中的"文本框"命令,然后大家可以根据自己的需要选择文本框的类型,例如,我们现在选择"横排文本框". 2.此时鼠标变成可

vc++-VC++中如何实现office中通过文件菜单打开命令,在试图中显示文本内容并且可以编辑?

问题描述 VC++中如何实现office中通过文件菜单打开命令,在试图中显示文本内容并且可以编辑? VC++中如何实现office中通过文件菜单打开命令,在试图中显示文本内容并且可以编辑通过CDC的文本输出函数在视图上显示的文本不能编辑 解决方案 你的意思是你希望做一个类似文本编辑器的程序吧,你不能用手动绘图的方式去实现,MFC好像有类似的功能提供.你用多文档模式或者单文档模式,视图类继承CEditView就自动可以编辑了. 希望能够帮到你. 解决方案二: 是不是自己做一个mfc单文档程序,然后

textview-TextView中部分文本的自动链接问题

问题描述 TextView中部分文本的自动链接问题 如何给textview的部分文本添加自动链接?例如:我在TextView的文本是"请点击这里打开这个网页".我想只在文本"这里"显示链接.当我点击"这里"这两个字,就能打开那个网页,点击其它文本不能链接. 解决方案 Textviews可以显示HTML就解决了你的问题.在hyperlink中实现你想要的点击链接 String html = ""My link is <a

文本 编辑器 语义 c++-对特定图文编辑器中的文本内容进行语义分析

问题描述 对特定图文编辑器中的文本内容进行语义分析 举个例子,比如都是感冒,症状也就是哪几样,头痛,流涕等,但每个医生对每个患者的描述却不同, 有头痛或流涕症状的不一定就是感冒,需要做的功能就是从病历描述中读懂语意,从而确定是不是感冒. 或者给出大致可能的判断,供医生参考. 同时最好能筛选出之前的类似的病历. 求问:我该怎么做? 难度究竟有多大? 解决方案 难度有多大,你看看这个问题右边的"相关参考资料"匹配出来的内容和你的问题的关联程度就知道了. 解决方案二: 反正我没有在任何一个H

ios-对UILabel中的文本进行高亮设置

问题描述 对UILabel中的文本进行高亮设置 我想要高亮处理UILabel中的文字部分.给label使用了backgroundColor .但是执行之后,标签中的空白部分也被高亮了,很难看.有没有办法只高亮文本部分,不影响UILabel的尺寸? 看效果图,label比文字多出来(居中对齐) 谢谢. 解决方案 用这段代码可以给text后面添加子视图: CGSize size= [[label text] sizeWithFont:[UIFont systemFontOfSize:18.0]];

怎么用jquery获取servlet中xml标签中的文本内容,

问题描述 怎么用jquery获取servlet中xml标签中的文本内容, // person.find("name").text; 这句话帮忙看下为什么返回不了文本内容? function but() { $.ajax({ type : "GET", url : "/AJAX/CServlet", dataType : "xml", success : function(data) { $(data).find("p

textfield-在qml中如何获取 TextField中的文本内容

问题描述 在qml中如何获取 TextField中的文本内容 我用qml创建了一个TextField,现在想在某个条件下想获得TextFied中的文本的内容,不知道应该怎么获取???

怎么通过message对象获取消息体中的文本内容

问题描述 怎么通过message对象获取消息体中的文本内容 解决方案 这里得到message对象后,强转一下类型EMTextMessageBody txtBody = (EMTextMessageBody) message.getBody();txtBody.getMessage()