Partilhar via


Como: Abrir um ficheiro largado em um controlo RichTextBox

No Windows Presentation Foundation (WPF), os controles TextBox, RichTextBoxe FlowDocument têm a funcionalidade interna de arrastar e soltar. A funcionalidade interna permite arrastar e soltar texto dentro e entre os controles. No entanto, ele não permite abrir um arquivo soltando o arquivo no controle. Esses controles também marcam os eventos de 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 manipulação 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á tenha sido marcado como manipulado por outro elemento ao longo da rota do evento.

Sugestão

Você pode substituir a funcionalidade interna de arrastar e soltar do TextBox, RichTextBoxe FlowDocument manipulando as versões de visualização dos eventos de arrastar e soltar e marcando os eventos de visualização como manipulados. No entanto, isso desativará 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 ficheiro de texto que é largado no RichTextBox.

Para testar este exemplo, arraste um ficheiro de texto ou um ficheiro RTF (rich text format) do Explorador do Windows para o RichTextBox. O arquivo será aberto no RichTextBox. Se você pressionar a tecla SHIFT antes de soltar 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