2009-10-23 6 views
5

Tôi có một FlowFocument WPF có một vài InlineUIContainers, đây là những InlineUIContainers đơn giản, có chứa một nút theo kiểu với một số văn bản trong Button.Content. Khi tôi sao chép văn bản và InlineUIContainer chứa nút từ FlowDocument đến một TextBox, nút này không được sao chép.Làm cách nào để sao chép nội dung WPF FlowDocument InlineUIContainer?

Có thể bằng cách nào đó chuyển đổi nút nội tuyến hoặc chuyển đổi nút thành văn bản trong dữ liệu văn bản được dán. Tôi đã thử bằng cách sử dụng sự kiện FlowDocument.DataObject.Copying, nhưng tôi dường như không thể tìm thấy bất kỳ mẫu tốt về cách sử dụng này hoặc thậm chí nếu điều này là đúng hướng.

Cảm ơn bạn

Trả lời

12

tôi đã cùng một vấn đề và quản lý để có được một cái gì đó như sau để làm việc:

public class MyRichTextBox : RichTextBox 
{ 
    public MyRichTextBox() 
     : base() 
    { 
     CommandManager.RegisterClassCommandBinding(typeof(MyRichTextBox), 
                new CommandBinding(ApplicationCommands.Copy, OnCopy, OnCanExecuteCopy)); 
    } 

    private static void OnCanExecuteCopy(object target, CanExecuteRoutedEventArgs args) 
    { 
     MyRichTextBox myRichTextBox = (MyRichTextBox)target; 
     args.CanExecute = myRichTextBox.IsEnabled && !myRichTextBox.Selection.IsEmpty; 
    } 

    private static void OnCopy(object sender, ExecutedRoutedEventArgs e) 
    { 
     MyRichTextBox myRichTextBox = (MyRichTextBox)sender; 
     Clipboard.SetText(GetInlineText(myRichTextBox)); 
     e.Handled = true; 
    } 

    private static string GetInlineText(RichTextBox myRichTextBox) 
    { 
     StringBuilder sb = new StringBuilder(); 
     foreach (Block b in myRichTextBox.Document.Blocks) 
     { 
      if (b is Paragraph) 
      { 
       foreach (Inline inline in ((Paragraph)b).Inlines) 
       { 
        if (inline is InlineUIContainer) 
        { 
         InlineUIContainer uiContainer = (InlineUIContainer)inline; 
         if (uiContainer.Child is Button) 
          sb.Append(((Button)uiContainer.Child).Content); 
        } 
        else if (inline is Run) 
        { 
         Run run = (Run)inline; 
         sb.Append(run.Text); 
        } 
       } 
      } 
     } 
     return sb.ToString(); 
    } 
} 

Tất nhiên điều này là rất đơn giản - có thể bạn sẽ tạo ra một lớp con của Button và xác định một giao diện-chức năng như "GetCopyToClipboardText" thay vì có "làm thế nào để có được văn bản từ một nút" -code bên trong richtextbox.

Ví dụ sao chép tất cả văn bản bên trong richtextbox - nó sẽ hữu ích hơn nếu chỉ phần được chọn của hộp văn bản được sao chép vào khay nhớ tạm. This post đưa ra ví dụ về cách đạt được điều đó.