2011-04-28 38 views
11

Cách tốt nhất để phát hiện xem RichFox/FlowDocument của WPF có trống không?Phát hiện xem RichTextBox có trống không

Các công trình sau đây chỉ khi văn bản xuất hiện trong tài liệu. Không nếu nó chứa UIElement của

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

Trả lời

13

Bạn có thể so sánh các con trỏ, mà không phải là tất cả các quá đáng tin cậy:

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

này đánh giá để 2 nếu RTB được nạp, và 4 nếu nội dung đã được nhập và đã xóa một lần nữa.
Nếu RTB được xóa hoàn toàn, ví dụ: qua select all -> delete giá trị sẽ là 0.


Trong Silverlight reference on MSDN phương pháp khác được tìm thấy có thể áp dụng và cải tiến để:

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

Số đếm là số ngay cả khi RichTextBox trống. –

+0

Hmm, điều đó thực sự có ý nghĩa ... –

+0

Tôi đã chỉnh sửa câu trả lời của mình để hiển thị một cách tiếp cận khác, mặc dù nó hơi lạ. –

0

Câu trả lời ở trên tác phẩm nếu bạn không đặt bất cứ điều gì vào RTB. Tuy nhiên, nếu bạn chỉ xóa nội dung, RTB có xu hướng trả về một đoạn văn trống, không phải là một chuỗi rỗng hoàn toàn. Vì vậy, điều này đáng tin cậy hơn trong các trường hợp như vậy:

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

Điều này chỉ áp dụng cho nội dung văn bản, tất nhiên.

3

Câu trả lời của H.B. không hữu ích nếu bạn cần phân biệt giữa hình ảnh và khoảng trắng. Bạn có thể sử dụng một cái gì đó như this answer để kiểm tra hình ảnh.

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

Điều này có vẻ mất thời gian và vẫn có thể không chính xác cho tất cả các trường hợp. Nhưng tôi không thể tìm được cách nào tốt hơn.

0

Đầu tiên - cảm ơn McGarnagle - câu trả lời của họ đã giúp tôi đi đúng hướng. Tuy nhiên vì lý do gì đó, kiểm tra hình ảnh của họ không hiệu quả với tôi. Đây là những gì tôi đã kết thúc:

Private Function RichTextBoxIsEmpty(BYVAL rtb As RichTextBox) As Boolean 

    Dim ReturnCode As Boolean = True 

    Dim text As String = New TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd).Text 

    If String.IsNullOrWhiteSpace(text) Then 

     For Each block As Block In rtb.Document.Blocks 

      'check for an image 
      If TypeOf block Is Paragraph Then 
       Dim paragraph As Paragraph = DirectCast(block, Paragraph) 
       For Each inline As Inline In paragraph.Inlines 
        If TypeOf inline Is InlineUIContainer Then 
         Dim uiContainer As InlineUIContainer = DirectCast(inline, InlineUIContainer) 
         If TypeOf uiContainer.Child Is Image Then 
          ReturnCode = False 
          Exit For 
         End If 
        End If 
       Next 
      End If 

      ' Check for a table 
      If TypeOf block Is Table Then 
       ReturnCode = False 
       Exit For 
      End If 

     Next 

    Else 

     ReturnCode = False 

    End If 

    Return ReturnCode 

End Function 

có thể có các kiểm tra khác để thực hiện, nhưng điều này ít nhất bao gồm văn bản, hình ảnh và bảng.

0

Đây là phần mở rộng ý tưởng của H.B. hoạt động với cả văn bản và hình ảnh .

Tôi thấy rằng sự khác biệt luôn là> 4 bất cứ khi nào RTB có văn bản. Tuy nhiên, nếu bạn chỉ dán một hình ảnh là 3. Để chống lại điều này tôi nhìn vào chiều dài chuỗi của chuỗi rtf thô.

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

Qua thử nghiệm của tôi cho thấy một ô trống không có ký tự có chiều dài 270. Nếu tôi thậm chí dán trong một hình ảnh đó chỉ 1 pixel kích thước nó khinh khí cầu đến 406.

tôi chơi với toggling trên các tùy chọn định dạng khác nhau mà không cần gõ bất kỳ chữ cái và đã không nhận được gần 300, vì vậy tôi đã đi với 350 cho đường cơ sở.

Kiểm tra độ dài có thể tốn kém nếu không có ký tự văn bản, nhưng chúng được dán trong một hình ảnh lớn.

Các vấn đề liên quan