2011-04-28 80 views
11

检测WPF RichTextBox/FlowDocument是否为空的最佳方法是什么?检测RichTextBox是否为空

如果只有文本出现在文档中,以下方法才有效。若它包含的UIElement的

new TextRange(Document.ContentStart, Document.ContentEnd).IsEmpty 

回答

13

你可以比较的指针,这是不是太可靠:如果内容已经进入

var start = rtb.Document.ContentStart; 
var end = rtb.Document.ContentEnd; 
int difference = start.GetOffsetToPosition(end); 

如果RTB加载此计算结果为24和再次移除。
如果RTB被完全清除,例如通过select all -> delete该值将为0


Silverlight reference on MSDN另一种方法是发现了可适应和改进,以:

public bool IsRichTextBoxEmpty(RichTextBox rtb) 
{ 
    if (rtb.Document.Blocks.Count == 0) return true; 
    TextPointer startPointer = rtb.Document.ContentStart.GetNextInsertionPosition(LogicalDirection.Forward); 
    TextPointer endPointer = rtb.Document.ContentEnd.GetNextInsertionPosition(LogicalDirection.Backward); 
    return startPointer.CompareTo(endPointer) == 0; 
} 
+0

即使RichTextBox为空,计数也是1。 – 2011-04-28 22:22:34

+0

嗯,这实际上是有道理的... – 2011-04-28 22:23:40

+0

我编辑了我的答案,以显示另一种方法,但它有点奇怪。 – 2011-04-28 22:40:31

0

上述工程的答案,如果你不把任何东西到RTB。但是,如果您只是删除内容,RTB往往会返回一个空的段落,而不是完全空的字符串。所以,在这种情况下这更可靠:

string text = new TextRange(Document.ContentStart, Document.ContentEnd).Text; 
return !String.IsNullOrWhiteSpace(text); 

这当然只适用于文本内容。

3

如果您需要区分图像和空白,H.B.的答案是无用的。你可以使用像this answer这样的东西来检查图像。

bool IsEmpty(Document document) 
{ 
    string text = new TextRange(Document.ContentStart, Document.ContentEnd).Text; 
    if (string.IsNullOrWhiteSpace(text) == false) 
     return false; 
    else 
    { 
     if (document.Blocks.OfType<BlockUIContainer>() 
      .Select(c => c.Child).OfType<Image>() 
      .Any()) 
     return false; 
    } 
    return true; 
} 

这似乎很费力,而且对于所有情况来说仍可能不正确。但我找不到更好的方法。

0

首先 - 感谢McGarnagle--他们的回答让我朝着正确的方向前进。然而,无论什么原因,他们的形象检查不适合我。这是我最终做的:

​​

可能还有其他的检查办法,但这至少包括文字,图像和表格。

0

这是H.B.的想法的延伸,可以与文本和图像一起使用。

我发现每当RTB有文本时差别总是> 4。然而,如果你只粘贴一个图像,它是3.为了解决这个问题,我看看原始rtf字符串的字符串长度。

var start = Document.ContentStart; 
var end = Document.ContentEnd; 
var difference = start.GetOffsetToPosition(end); 

HasText = difference > 4 || GetRtfText().Length > 350; 


public string GetRtfText() 
{ 
    var tr = new TextRange(Document.ContentStart, Document.ContentEnd); 
    using (var ms = new MemoryStream()) 
    { 
    tr.Save(ms, DataFormats.Rtf); 
    return Encoding.Default.GetString(ms.ToArray()); 
    } 
} 

通过我的测试中,我发现,没有字符一个空框有270的长度。如果我连这唯一的1个像素在它的气球406

我打尺寸的图像粘贴在在不输入任何字母的情况下切换各种格式化选项并且没有接近300,所以我以350为底线。

如果没有文本字符,则长度检查可能很昂贵,但它们粘贴的图像很大。