Procedura: aprire un file rilasciato in un controllo RichTextBoxHow to: Open a File That is Dropped on a RichTextBox Control

In Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF), TextBox, RichTextBox, e FlowDocument tutti i controlli sono incorporate funzionalità di trascinamento e rilascio.In Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF), the TextBox, RichTextBox, and FlowDocument controls all have built-in drag-and-drop functionality. La funzionalità incorporata consente di trascinamento e rilascio del testo all'interno e tra i controlli.The built-in functionality enables drag-and-drop of text within and between the controls. Tuttavia, non consente l'apertura di un file eliminando il file nel controllo.However, it does not enable opening a file by dropping the file on the control. Questi controlli inoltre contrassegnano gli eventi di trascinamento e rilascio come gestito.These controls also mark the drag-and-drop events as handled. Di conseguenza, per impostazione predefinita, è possibile aggiungere i propri gestori eventi per fornire la funzionalità di apertura file rilasciati.As a result, by default, you cannot add your own event handlers to provide functionality to open dropped files.

Per aggiungere ulteriori operazioni di gestione per gli eventi di trascinamento e rilascio in questi controlli, utilizzare il AddHandler(RoutedEvent, Delegate, Boolean) metodo per aggiungere i gestori eventi per gli eventi di trascinamento e rilascio.To add additional handling for drag-and-drop events in these controls, use the AddHandler(RoutedEvent, Delegate, Boolean) method to add your event handlers for the drag-and-drop events. Impostare il handledEventsToo parametro true per il gestore specificato venga richiamato per un evento indirizzato è già stato contrassegnato come gestito da un altro elemento lungo la route dell'evento.Set the handledEventsToo parameter to true to have the specified handler be invoked for a routed event that has already been marked as handled by another element along the event route.

Suggerimento

È possibile sostituire la funzionalità di trascinamento e rilascio predefinita di TextBox, RichTextBox, e FlowDocument gestendo le versioni di anteprima degli eventi di trascinamento e rilascio e contrassegnare gli eventi di anteprima come gestito.You can replace the built-in drag-and-drop functionality of TextBox, RichTextBox, and FlowDocument by handling the preview versions of the drag-and-drop events and marking the preview events as handled. Tuttavia, questo disabiliterà la funzionalità di trascinamento e rilascio predefinita e non è consigliato.However, this will disable the built-in drag-and-drop functionality, and is not recommended.

EsempioExample

Nell'esempio seguente viene illustrato come aggiungere i gestori per il DragOver e Drop eventi su un RichTextBox.The following example demonstrates how to add handlers for the DragOver and Drop events on a RichTextBox. Questo esempio viene utilizzato il AddHandler(RoutedEvent, Delegate, Boolean) (metodo) e imposta il handledEventsToo parametro true in modo che verranno richiamati anche se i gestori degli eventi il RichTextBox contrassegna questi eventi come gestito.This example uses the AddHandler(RoutedEvent, Delegate, Boolean) method and sets the handledEventsToo parameter to true so that the events handlers will be invoked even though the RichTextBox marks these events as handled. Il codice nei gestori di eventi consente di aprire un file di testo che viene eliminato il RichTextBox.The code in the event handlers adds functionality to open a text file that is dropped on the RichTextBox.

Per testare questo esempio, trascinare un file di testo o un file di formato RTF RTF da Esplora risorse per il RichTextBox.To test this example, drag a text file or a rich text format (RTF) file from Windows Explorer to the RichTextBox. Il file verrà aperto nel RichTextBox.The file will be opened in the RichTextBox. Se si preme il tasto MAIUSC prima di eliminare il file, verrà aperto il file come testo normale.If you press the SHIFT key before the dropping the file, the file will be opened as plain text.

<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