2011-04-28 28 views
11

WPF RichTextBox/FlowDocumentが空であるかどうかを検出する最良の方法は何ですか?RichTextBoxが空であるかどうかを検出する

文書にテキストのみが含まれている場合は、次のように動作します。それはのUIElementの

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

答えて

13

が含まれている場合は、あまりにも信頼できないポインタ、比較できない:コンテンツが入力された場合、これはRTBがロードされている場合2と評価され、4

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

をし、再び削除されました。
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

リッチテキストボックスが空の場合でもカウントは1です。 –

+0

うん、それは実際に意味がある... –

+0

私は別のアプローチを示すために私の答えを編集した、それは少し奇妙です。 –

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()); 
    } 
} 

私はさえ、それは私がと遊んだ406

に風船のサイズにのみ1ピクセルの画像に貼り付けると無文字と空のボックスは、270の長さを持っていることがわかりました文字を入力せずにさまざまな書式設定オプションを切り替え、300に近づかなかったので、私はベースラインのために350を使いました。

文字の文字がない場合は長さのチェックが高価になることがありますが、大量の画像に貼り付けられます。

関連する問題