Compartilhar via


Como abrir um arquivo solto em um controle RichTextBox

No WPF (Windows Presentation Foundation), os controles TextBox, RichTextBoxe FlowDocument têm funcionalidade interna de arrastar e soltar. A funcionalidade interna permite arrastar e soltar o texto dentro e entre os controles. No entanto, ela não habilita a abertura de um arquivo soltando-o no controle. Esses controles também marcam os eventos do tipo "arrastar e soltar" como manipulados. Como resultado, por padrão, você não pode adicionar seus próprios manipuladores de eventos para fornecer funcionalidade para abrir arquivos descartados.

Para adicionar tratamento adicional para eventos de arrastar e soltar nesses controles, use o método AddHandler(RoutedEvent, Delegate, Boolean) para adicionar seus manipuladores de eventos para os eventos de arrastar e soltar. Defina o parâmetro handledEventsToo como true para que o manipulador especificado seja invocado para um evento roteado que já foi marcado como manipulado por outro elemento ao longo da rota do evento.

Dica

Você pode substituir a funcionalidade interna de arrastar e soltar de TextBox, RichTextBox e FlowDocument, manipulando as versões de pré-visualização dos eventos de arrastar e soltar e marcando os eventos de pré-visualização como manipulados. No entanto, isso desabilitará a funcionalidade interna de arrastar e soltar e não é recomendado.

Exemplo

O exemplo a seguir demonstra como adicionar manipuladores para os eventos DragOver e Drop em um RichTextBox. Este exemplo usa o método AddHandler(RoutedEvent, Delegate, Boolean) e define o parâmetro handledEventsToo como true para que os manipuladores de eventos sejam invocados mesmo que o RichTextBox marque esses eventos como manipulados. O código nos manipuladores de eventos adiciona funcionalidade para abrir um arquivo de texto que foi solto no RichTextBox.

Para testar este exemplo, arraste um arquivo de texto ou um arquivo RTF (rich text format) do Windows Explorer para o RichTextBox. O arquivo será aberto no RichTextBox. Se você pressionar a tecla SHIFT antes de remover o arquivo, o arquivo será aberto como texto sem formatação.

<RichTextBox x:Name="richTextBox1"
             AllowDrop="True" />
public MainWindow()
{
    InitializeComponent();

    // Add using System.Windows.Controls;
    richTextBox1.AddHandler(RichTextBox.DragOverEvent, new DragEventHandler(RichTextBox_DragOver), true);
    richTextBox1.AddHandler(RichTextBox.DropEvent, new DragEventHandler(RichTextBox_Drop), true);
}

private void RichTextBox_DragOver(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        e.Effects = DragDropEffects.All;
    }
    else
    {
        e.Effects = DragDropEffects.None;
    }
    e.Handled = false;
}

private void RichTextBox_Drop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        string[] docPath = (string[])e.Data.GetData(DataFormats.FileDrop);

        // By default, open as Rich Text (RTF).
        var dataFormat = DataFormats.Rtf;

        // If the Shift key is pressed, open as plain text.
        if (e.KeyStates == DragDropKeyStates.ShiftKey)
        {
            dataFormat = DataFormats.Text;
        }

        System.Windows.Documents.TextRange range;
        System.IO.FileStream fStream;
        if (System.IO.File.Exists(docPath[0]))
        {
            try
            {
                // Open the document in the RichTextBox.
                range = new System.Windows.Documents.TextRange(richTextBox1.Document.ContentStart, richTextBox1.Document.ContentEnd);
                fStream = new System.IO.FileStream(docPath[0], System.IO.FileMode.OpenOrCreate);
                range.Load(fStream, dataFormat);
                fStream.Close();
            }
            catch (System.Exception)
            {
                MessageBox.Show("File could not be opened. Make sure the file is a text file.");
            }
        }
    }
}
Public Sub New()
    InitializeComponent()

    richTextBox1.AddHandler(RichTextBox.DragOverEvent, New DragEventHandler(AddressOf RichTextBox_DragOver), True)
    richTextBox1.AddHandler(RichTextBox.DropEvent, New DragEventHandler(AddressOf RichTextBox_Drop), True)

End Sub

Private Sub RichTextBox_DragOver(sender As Object, e As DragEventArgs)
    If e.Data.GetDataPresent(DataFormats.FileDrop) Then
        e.Effects = DragDropEffects.All
    Else
        e.Effects = DragDropEffects.None
    End If
    e.Handled = False
End Sub

Private Sub RichTextBox_Drop(sender As Object, e As DragEventArgs)
    If e.Data.GetDataPresent(DataFormats.FileDrop) Then
        Dim docPath As String() = TryCast(e.Data.GetData(DataFormats.FileDrop), String())

        ' By default, open as Rich Text (RTF).
        Dim dataFormat = DataFormats.Rtf

        ' If the Shift key is pressed, open as plain text.
        If e.KeyStates = DragDropKeyStates.ShiftKey Then
            dataFormat = DataFormats.Text
        End If

        Dim range As TextRange
        Dim fStream As IO.FileStream
        If IO.File.Exists(docPath(0)) Then
            Try
                ' Open the document in the RichTextBox.
                range = New TextRange(richTextBox1.Document.ContentStart, richTextBox1.Document.ContentEnd)
                fStream = New IO.FileStream(docPath(0), IO.FileMode.OpenOrCreate)
                range.Load(fStream, dataFormat)
                fStream.Close()
            Catch generatedExceptionName As System.Exception
                MessageBox.Show("File could not be opened. Make sure the file is a text file.")
            End Try
        End If
    End If
End Sub