Sdílet prostřednictvím


Jak na to: Otevření souboru, který je přetažen na ovládací prvek RichTextBox

Ve Windows Presentation Foundation (WPF) mají ovládací prvky TextBox, RichTextBoxa FlowDocument integrované funkce přetažení. Integrovaná funkce umožňuje přetahování textu uvnitř ovládacích prvků a mezi těmito ovládacími prvky. Nepovoluje ale otevření souboru přetažením souboru na ovládací prvek. Tyto ovládací prvky také označí události přetažení jako zpracované. V důsledku toho ve výchozím nastavení nemůžete přidat vlastní obslužné rutiny událostí, které poskytují funkce pro otevření vynechaných souborů.

Pokud chcete v těchto ovládacích prvcích přidat dodatečné zpracování událostí přetahování, použijte metodu AddHandler(RoutedEvent, Delegate, Boolean) a přidejte své obslužné rutiny pro události přetahování. Nastavte parametr handledEventsToo na true, aby byla zadaná obslužná rutina vyvolána pro směrovanou událost, která již byla označena jako zpracována jiným prvkem podél trasy události.

Tip

Vestavěné funkce přetahování TextBox, RichTextBoxa FlowDocument můžete nahradit zpracováním náhledových verzí událostí přetažení a označením těchto událostí jako zpracovaných. Tím se ale zakáže integrovaná funkce přetažení myší a nedoporučuje se.

Příklad

Následující příklad ukazuje, jak přidat obslužné rutiny pro události DragOver a Drop na RichTextBox. Tento příklad používá metodu AddHandler(RoutedEvent, Delegate, Boolean) a nastaví parametr handledEventsToo na true tak, aby obslužné rutiny událostí byly vyvolány, i když RichTextBox tyto události označí jako zpracovávané. Kód v obslužných rutinách událostí přidává funkci pro otevření textového souboru, který je přetažen na RichTextBox.

Chcete-li tento příklad otestovat, přetáhněte textový soubor nebo formát RTF z Průzkumníka Windows do RichTextBox. Soubor bude otevřen v RichTextBox. Pokud před vyřazením souboru stisknete klávesu SHIFT, soubor se otevře jako prostý text.

<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