Bagikan melalui


Cara: Membuka File yang Dihilangkan pada Kontrol RichTextBox

Di Windows Presentation Foundation (WPF), kontrol TextBox, RichTextBox, dan FlowDocument memiliki fungsionalitas seret dan letakkan bawaan. Fungsionalitas bawaan memungkinkan seret dan letakkan teks di dalam dan di antara kontrol. Namun, itu tidak memungkinkan pembukaan file dengan menjatuhkan file ke kontrol. Kontrol ini juga menandai peristiwa seret dan letakkan sebagai ditangani. Akibatnya, secara default, Anda tidak dapat menambahkan penanganan aktivitas Anda sendiri untuk menyediakan fungsionalitas untuk membuka file yang dihilangkan.

Untuk menambahkan penanganan tambahan untuk peristiwa seret dan letakkan dalam kontrol ini, gunakan metode AddHandler(RoutedEvent, Delegate, Boolean) untuk menambahkan penanganan aktivitas Anda untuk peristiwa seret dan letakkan. Atur parameter handledEventsToo ke true agar handler yang ditentukan dipanggil untuk peristiwa rute yang telah ditandai sebagai ditangani oleh elemen lain di sepanjang rute peristiwa.

Petunjuk / Saran

Anda dapat mengganti fungsi bawaan tarik dan lepas TextBox, RichTextBox, dan FlowDocument dengan menangani versi pratinjau dari acara tarik dan lepas serta menandai acara pratinjau tersebut sebagai telah ditangani. Namun, ini akan menonaktifkan fungsionalitas seret dan letakkan bawaan, dan tidak disarankan.

Contoh

Contoh berikut menunjukkan cara menambahkan handler untuk peristiwa DragOver dan Drop pada RichTextBox. Contoh ini menggunakan metode AddHandler(RoutedEvent, Delegate, Boolean) dan mengatur parameter handledEventsToo ke true sehingga penanganan peristiwa akan dipanggil meskipun RichTextBox menandai peristiwa ini sebagai ditangani. Kode dalam penanganan aktivitas menambahkan fungsionalitas untuk membuka file teks yang dihilangkan pada RichTextBox.

Untuk menguji contoh ini, seret file teks atau file format teks kaya (RTF) dari Windows Explorer ke RichTextBox. Berkas akan dibuka di RichTextBox. Jika Anda menekan tombol SHIFT sebelum menjatuhkan file, file akan dibuka sebagai teks biasa.

<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