UWP程序开发问题:RichEditBox多对象RTF内容切换显示
搞定UWP RichEditBox切换显示多对象RTF内容的方案
我来帮你解决这个问题——核心就是要把每个对象的RTF格式内容单独存储,然后在切换对象时完成「保存当前内容→加载新内容」的流程,具体步骤如下:
1. 先给你的对象定义一个能存RTF的模型
首先你需要给每个独立对象加一个属性,专门用来存储它对应的RTF文本,而不是普通字符串。比如创建一个简单的类:
public class TextObject { // 用来区分不同对象的标识(比如ID、名称) public string ObjectId { get; set; } // 存储该对象的完整RTF内容 public string RtfContent { get; set; } }
这样每个对象的富文本格式就能完整保留,不会丢失样式。
2. 实现「切换前保存当前编辑内容」的逻辑
在点击新对象之前,必须把RichEditBox里当前编辑的内容导出为RTF格式,存回之前选中的对象里。用RichEditBox的Document.GetText方法就能轻松获取RTF:
private void SaveCurrentText(TextObject currentSelectedObject) { if (currentSelectedObject == null || MyRichEditBox.Document == null) return; // 把RichEditBox的内容导出为RTF字符串 MyRichEditBox.Document.GetText(Windows.UI.Text.TextGetOptions.FormatRtf, out string currentRtf); // 存回当前对象的属性里 currentSelectedObject.RtfContent = currentRtf; }
3. 实现「加载新对象RTF内容」的逻辑
选中新对象后,把它存储的RTF内容导入到RichEditBox中,用Document.SetText方法即可:
private void LoadTargetText(TextObject targetObject) { if (targetObject == null || MyRichEditBox.Document == null) return; // 清空当前内容并导入目标对象的RTF MyRichEditBox.Document.SetText(Windows.UI.Text.TextSetOptions.FormatRtf, targetObject.RtfContent ?? string.Empty); // 可选:把光标定位到开头,提升用户体验 MyRichEditBox.Document.Selection.StartPosition = 0; }
4. 绑定对象点击/选择事件
假设你的对象是放在ListBox或GridView这类控件里的,直接处理选择变更事件就行:
private void ObjectList_SelectionChanged(object sender, SelectionChangedEventArgs e) { // 先保存之前选中对象的内容 if (e.RemovedItems.Count > 0) { var previousObject = e.RemovedItems[0] as TextObject; SaveCurrentText(previousObject); } // 再加载新选中对象的内容 if (e.AddedItems.Count > 0) { var newSelectedObject = e.AddedItems[0] as TextObject; LoadTargetText(newSelectedObject); } }
一些细节提示
- 如果是第一次加载某个对象,它的
RtfContent可能为空,这时候RichEditBox会显示空白,完全符合预期;如果需要默认内容,可以给RtfContent赋值一个基础RTF字符串,比如@"{\rtf1\ansi\deff0 请输入内容...}"。 - 确保RichEditBox的
IsReadOnly属性设为false,不然无法编辑内容。 - 如果用MVVM模式,可以把选中对象绑定到ViewModel的属性,在属性变更时触发保存和加载逻辑(注意RichEditBox的RTF没有直接的双向绑定,需要通过事件或行为同步)。
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

