有人知道如何做到这一点吗?谢谢。
编辑:
通过“拆分”,我指的是将超出高度限制的内容放入另一个RichTextBox中,由于项目的特殊性,解决方案不能只更改当前RichTextBox的外观。
在此方法中,获取底层 richTextBox flowDocument 并检索 Paginator。设置 MaxPageHeight 并计算文档页数。
var flowDocument = this.Document;
flowDocument.MaxPageHeight = this.MaxContentHeight;
DocumentPaginator paginator = ((IDocumentPaginatorSource)flowDocument).DocumentPaginator;
paginator.ComputePageCount();
我想我得到了你的答案...感谢Google和stackoverflow。
一个WPF FlowDocument只能属于一个RichTextBox。但是,如果您使用单个文档,在UI的不同点可以对其进行操作,则不会发生两个RichTextBox同时显示单个文档(因为WPF会抱怨)。但是,您是否正在使用单个文档还是多个文档?如果是单个,请继续阅读;如果不是,请移步下一段。
在此处使用MemoryStream和XamlReader / Writer将不起作用,因为我们希望保留单个文档并在使用它的任何位置反映更改,因此每次复制它都不行。这是从stackoverflow的成员Jared中复制的。
WPF控件可以随意“取消父子关系”和“重新父子关系”,因此只需在向导共享的上下文中使RichTextBox实例可用,并确保在从一页到另一页移动时取消父子关系/重新父子关系即可。这还有一个好处,即在向导的各个页面中保存编辑器状态的任何样式或更改(可能是值得欢迎的)。
如果无法在页面之间共享RichTextBox实例,我认为有一种方法可以将文档与原始的RichTextBox分离。似乎要将文档与RichTextBox1分离,必须为RichTextBox1提供一个新文档。您不能将RichTextBox1.Document设置为null,但是您可以将RichTextBox1.Document设置为new FlowDocument(),我相信这样会起作用。
从上面可以看出,FlowDocument不能直接由多个RichTextBox控件共享。因此,如我上面所述,请使用网格。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
在代码后台中使用包装RTB
FlowDocument doc = RTB1.Document;
RTB1.Document = new FlowDocument();
RTB2.Document = doc;
我不知道这是否会分割控件,但我们可以在另一个 RTB 中看到单个文档。
private TextRange GetTopRange()
{
var result = textBox.GetPositionFromPoint(new Point(0, 0), true);
if (result == null)
return null;
result = result.GetInsertionPosition(LogicalDirection.Forward);
return new TextRange(result.DocumentStart, result);
}
private TextRange GetBottomRange()
{
var result = textBox.GetPositionFromPoint(new Point(textBox.ActualWidth, textBox.ActualHeight), true);
if (result == null)
return null;
result = result.GetInsertionPosition(LogicalDirection.Backward);
return new TextRange(result, result.DocumentEnd);
}
有了文字范围,您可以将它们复制到另一个RichTextBox的新FlowDocument中,截断它们(range.Text = string.Empty
)等。
Private Sub rtb_ContentsResized(ByVal sender As Object, ByVal e As System.Windows.Forms.ContentsResizedEventArgs) Handles txtQuestion.ContentsResized
Dim h = e.NewRectangle.Height, w = e.NewRectangle.Width
h = Math.Max(h, sender.Font.Height)
h = Math.Min(h, Me.ClientSize.Height - 10 - sender.Top)
h += sender.Height - sender.ClientSize.Height + 1
sender.Height = h
End Sub
如果有任何这方面的C#代码,我不知道。
还有额外的信息- Richtextbox控件是使用GDI绘制的,而“Graphics.MeasureString”是使用GDI+测量字符串的。因此,“MeasureString”不会返回字符串的精确大小。我担心您将不得不深入研究GDI32-API以获得精确结果。如果您有兴趣使用Win32 GDI API调用,请点击此处。
public void CreateNewRtb(object sender, RoutedEventArgs routedEventArgs)
{
var res = (ResourceDictionary)Application.LoadComponent(new Uri("/Design/Style/TextAreaStyle.xaml", UriKind.Relative));
var mcRtb = new RichTextBox {Style = (Style) res["TextBoxStyle"], Name = "Folha" + J};
RegisterName("Folha" + J, mcRtb);
mcRtb.TextChanged += McRtbContentControl;
var gcrd = new RowDefinition();
var gcrdspace = new RowDefinition();
gcrd.Height = new GridLength(980);
GridControl.RowDefinitions.Add(gcrd);
Grid.SetColumn(mcRtb, 1);
Grid.SetRow(mcRtb, 1 + I);
GridControl.Children.Add(mcRtb);
I += 2;
J++;
gcrdspace.Height = new GridLength(30);
GridControl.RowDefinitions.Add(gcrdspace);
mcRtb.Focus();
}
这是一种简单的方法来控制月牙网格的大小,并随意创建 RTB :D