Freigeben über


Vorgehensweise: Öffnen einer Datei, die in einem RichTextBox-Steuerelement abgelegt wird

In Windows Presentation Foundation (WPF) haben die TextBox, RichTextBox und FlowDocument Steuerelemente alle integrierte Drag-and-Drop-Funktionen. Die integrierte Funktionalität ermöglicht das Ziehen und Ablegen von Text innerhalb und zwischen den Steuerelementen. Das Öffnen einer Datei wird jedoch nicht durch Ablegen der Datei im Steuerelement aktiviert. Diese Steuerelemente markieren auch die Drag-and-Drop-Ereignisse als behandelt. Daher können Sie standardmäßig keine eigenen Ereignishandler hinzufügen, um Funktionen zum Öffnen abgelegter Dateien bereitzustellen.

Um zusätzliche Verarbeitung für Drag-and-Drop-Ereignisse in diesen Steuerelementen hinzuzufügen, verwenden Sie die AddHandler(RoutedEvent, Delegate, Boolean) Methode, um die Ereignishandler für die Drag-and-Drop-Ereignisse hinzuzufügen. Stellen Sie den handledEventsToo-Parameter auf true ein, damit der angegebene Handler für ein geroutetes Ereignis aufgerufen wird, das bereits von einem anderen Element entlang der Ereignisroute als bearbeitet markiert wurde.

Tipp

Sie können die integrierten Drag-and-Drop-Funktionen von TextBox, RichTextBox und FlowDocument ersetzen, indem Sie die Vorschau der Drag-and-Drop-Ereignisse behandeln und diese Vorschauereignisse als bearbeitet markieren. Dies deaktiviert jedoch die integrierte Drag-and-Drop-Funktion und wird nicht empfohlen.

Beispiel

Das folgende Beispiel veranschaulicht das Hinzufügen von Handlern für die DragOver Und Drop Ereignisse in einem RichTextBox. In diesem Beispiel wird die AddHandler(RoutedEvent, Delegate, Boolean) Methode verwendet und der handledEventsToo Parameter auf true gesetzt, damit die Ereignishandler aufgerufen werden, obwohl die RichTextBox diese Ereignisse als behandelt markiert. Der Code in den Ereignishandlern fügt Funktionen zum Öffnen einer Textdatei hinzu, die in der RichTextBoxDatei abgelegt wird.

Um dieses Beispiel zu testen, ziehen Sie eine Textdatei oder eine RTF-Datei (Rich Text Format) von Windows Explorer in den RichTextBox. Die Datei wird in RichTextBox geöffnet. Wenn Sie vor dem Ablegen der Datei die UMSCHALTTASTE drücken, wird die Datei als Nur-Text geöffnet.

<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