Freigeben über


Gewusst wie: Öffnen einer Datei, die auf einem RichTextBox-Steuerelement abgelegt ist

In Windows Presentation Foundation (WPF) verfügen die TextBox-, RichTextBox- und FlowDocument-Steuerelemente über 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 aktiviert, indem die Datei auf dem Steuerelement gelöscht wird. 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.

Verwenden Sie die AddHandler(RoutedEvent, Delegate, Boolean)-Methode, um zusätzliche Behandlung für Drag-and-Drop-Ereignisse in diesen Steuerelementen hinzuzufügen, um Die Ereignishandler für die Drag-and-Drop-Ereignisse hinzuzufügen. Legen Sie handledEventsToo-Parameter auf true fest, damit der bereitgestellte Handler für ein Routingereignis aufgerufen wird, das bereits von einem anderen Element auf der Ereignisroute als behandelt markiert wurde.

Tipp

Sie können die integrierte Drag-and-Drop-Funktion von TextBox, RichTextBox und FlowDocument durch behandeln sie die Vorschauversionen der Drag-and-Drop-Ereignisse und das Markieren der Vorschauereignisse als behandelt. Dies deaktiviert jedoch die integrierte Drag-and-Drop-Funktionalität und wird nicht empfohlen.

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie Sie Handler für die DragOver- und Drop-Ereignisse einer RichTextBox hinzufügen. In diesem Beispiel wird die AddHandler(RoutedEvent, Delegate, Boolean)-Methode verwendet und der handledEventsToo-Parameter auf true festgelegt, sodass die Ereignishandler aufgerufen werden, obwohl diese RichTextBox-Ereignisse behandelt werden. Der Code in den Ereignishandlern fügt Funktionen zum Öffnen einer Textdatei hinzu, die auf der RichTextBox abgelegt werden.

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 der 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