2011-04-28 93 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爲底線。

如果沒有文本字符,則長度檢查可能很昂貴,但它們粘貼的圖像很大。