方法: RichTextBox コントロール上にドロップしたファイルを開く

Windows Presentation Foundation (WPF) では、TextBoxRichTextBoxFlowDocument コントロール全部にドラッグアンドドロップ機能が組み込まれています。 組み込み機能を使用すると、コントロール内およびコントロール間でテキストをドラッグ アンド ドロップできるようになります。 ただし、コントロール上にファイルをドロップすることによってファイルを開くことはできません。 また、これらのコントロールでは、ドラッグ アンド ドロップ イベントが処理済みとしてマークされます。 結果として、既定では、ドロップされたファイルを開く機能を提供するための独自のイベント ハンドラーを追加することはできません。

これらのコントロールにドラッグ アンド ドロップ イベントの処理を追加するには、AddHandler(RoutedEvent, Delegate, Boolean) メソッドを使用して、ドラッグ アンド ドロップ イベント用のイベント ハンドラーを追加します。 イベント ルート上の別の要素により既に処理済みとしてマークされているルーティング イベントに対し、指定したハンドラーが呼び出されるようにするには、handledEventsToo パラメーターを true に設定します。

ヒント

ドラッグ アンド ドロップ イベントのプレビューバージョンを処理し、プレビュー イベントを処理済みとしてマークすることによって、TextBoxRichTextBox、および FlowDocument の組み込みのドラッグ アンド ドロップ機能を置き換えることができます。 ただし、これにより組み込みのドラッグ アンド ドロップ機能が無効になるため、推奨されません。

次の例は、RichTextBox 上の DragOver および Drop イベントのハンドラーを追加する方法を示しています。 この例では、AddHandler(RoutedEvent, Delegate, Boolean) メソッドを使用し、handledEventsToo パラメーターを true に設定することで、RichTextBox でこれらのイベントが処理済みとしてマークされている場合でも、イベント ハンドラーが呼び出されるようにします。 イベント ハンドラーのコードにより、RichTextBox にドロップされたテキスト ファイルを開くための機能が追加されます。

この例をテストするには、Windows エクスプローラーから RichTextBox にテキスト ファイルまたはリッチ テキスト形式 (RTF) ファイルをドラッグします。 ファイルが 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.");
            }
        }
    }
}
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