Show / Hide Table of Contents

Практическое руководство. Открытие файла, перетащенного в элемент управления RichTextBox

В Windows Presentation Foundation (WPF), TextBox, RichTextBox, и FlowDocument все элементы управления имеют встроенные функции перетаскивания и вставки. Встроенные функции позволяет перетаскивания и вставки текста внутри и между элементами управления. Тем не менее не поддерживает открытие файла путем его перетаскивания на элементе управления. Эти элементы управления также отметить события перетаскивания и вставки, как обработанное. Таким образом по умолчанию, невозможно добавить собственные обработчики событий для обеспечения функциональных возможностей, чтобы открыть перенесенных файлов.

Чтобы добавить дополнительную обработку событий перетаскивания и вставки в этих элементах управления, используйте AddHandler(RoutedEvent, Delegate, Boolean) метод, чтобы добавить обработчики событий для событий перетаскивания и вставки. Задайте handledEventsToo параметр true иметь указанный обработчик вызывался для перенаправленного события, которое уже было отмечено как обработанное другим элементом на маршруте события.

Tip

Вы можете заменить встроенные функции и перетаскивать TextBox, RichTextBox, и FlowDocument путем обработки в предварительных версиях события перетаскивания и вставки и пометка события предварительного просмотра как обработанного. Тем не менее это приведет к отключению встроенные функции и перетаскивать и не рекомендуется.

Пример

Следующий пример демонстрирует добавление обработчиков для DragOver и Drop события на RichTextBox. В этом примере используется AddHandler(RoutedEvent, Delegate, Boolean) метод и наборы handledEventsToo параметр true таким образом, чтобы обработчики событий будет вызываться, даже если RichTextBox помечает эти события как обработанные. Код в обработчик событий добавляет функциональные возможности для открытия текстового файла, перетащенного в RichTextBox.

Чтобы протестировать этот пример, перетащите в текстовый файл или файл format (RTF) форматированного текста в обозревателе Windows к RichTextBox. Файл будет открыт в RichTextBox. Если нажать клавишу SHIFT при перетаскивании файла, файл будет открыт в виде обычного текста.

<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.");
            }
        }
    }
}
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX