在this article的方法爲我工作:
WPF RichTextBox中沒有提供的功能,以它的寬度 調整到文本。據我所知,RichTextBox在其可視化樹中使用 中的FlowDocumentView來呈現Flowdocument。它將採用可用的 空間來呈現其內容,因此它不會將其大小調整爲 內容。由於這是一個內部類,因此我們似乎無法覆蓋 佈局過程,讓RichTextBox將其大小調整爲 文本。
因此,我認爲你的方法是在正確的方向。 不幸的是,基於我的研究,沒有簡單的方法來測量RichTextBox中呈現的文本的大小 。
有一種解決方法,我們可以嘗試。我們可以循環遍歷RichTextBox中的flowdocument 以檢索所有Run和Paragraph對象。 然後我們將它們轉換成FormattedText以獲得大小。
This article演示如何將FlowDocument轉換爲 FormattedText。我還使用該文章中的 FlowDocumentExtensions類編寫了一個簡單示例。
public Window2()
{
InitializeComponent();
StackPanel layoutRoot = new StackPanel();
RichTextBox myRichTextBox = new RichTextBox() { Width=20};
this.Content = layoutRoot;
layoutRoot.Children.Add(myRichTextBox);
myRichTextBox.Focus();
myRichTextBox.TextChanged += new TextChangedEventHandler((o,e)=>myRichTextBox.Width=myRichTextBox.Document.GetFormattedText().WidthIncludingTrailingWhitespace+20);
}
public static class FlowDocumentExtensions
{
private static IEnumerable<TextElement> GetRunsAndParagraphs(FlowDocument doc)
{
for (TextPointer position = doc.ContentStart;
position != null && position.CompareTo(doc.ContentEnd) <= 0;
position = position.GetNextContextPosition(LogicalDirection.Forward))
{
if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.ElementEnd)
{
Run run = position.Parent as Run;
if (run != null)
{
yield return run;
}
else
{
Paragraph para = position.Parent as Paragraph;
if (para != null)
{
yield return para;
}
}
}
}
}
public static FormattedText GetFormattedText(this FlowDocument doc)
{
if (doc == null)
{
throw new ArgumentNullException("doc");
}
FormattedText output = new FormattedText(
GetText(doc),
CultureInfo.CurrentCulture,
doc.FlowDirection,
new Typeface(doc.FontFamily, doc.FontStyle, doc.FontWeight, doc.FontStretch),
doc.FontSize,
doc.Foreground);
int offset = 0;
foreach (TextElement el in GetRunsAndParagraphs(doc))
{
Run run = el as Run;
if (run != null)
{
int count = run.Text.Length;
output.SetFontFamily(run.FontFamily, offset, count);
output.SetFontStyle(run.FontStyle, offset, count);
output.SetFontWeight(run.FontWeight, offset, count);
output.SetFontSize(run.FontSize, offset, count);
output.SetForegroundBrush(run.Foreground, offset, count);
output.SetFontStretch(run.FontStretch, offset, count);
output.SetTextDecorations(run.TextDecorations, offset, count);
offset += count;
}
else
{
offset += Environment.NewLine.Length;
}
}
return output;
}
private static string GetText(FlowDocument doc)
{
StringBuilder sb = new StringBuilder();
foreach (TextElement el in GetRunsAndParagraphs(doc))
{
Run run = el as Run;
sb.Append(run == null ? Environment.NewLine : run.Text);
}
return sb.ToString();
}
}
這個問題不斷髮生在我身上和關閉,所以最終我剛剛崩潰,並命名爲父網格像「mainGrid」,並設置寬度=「{綁定ElementName = mainGrid,路徑= ActualWidth}」和高度=「{綁定元素名稱= mainGrid,Path = ActualHeight}「來強制我想要的行爲。 – Michael 2009-03-04 18:28:14