Partager via


Comment : ouvrir un fichier qui est déplacé dans un contrôle RichTextBox

Dans Windows Presentation Foundation (WPF), les TextBoxcontrôles et FlowDocument les RichTextBoxcontrôles ont toutes des fonctionnalités intégrées de glisser-déplacer. La fonctionnalité intégrée permet de glisser-déplacer du texte entre les contrôles et les glisser-déplacer. Toutefois, il n’active pas l’ouverture d’un fichier en supprimant le fichier sur le contrôle. Ces contrôles marquent également les événements de glisser-déplacer comme gérés. Par conséquent, par défaut, vous ne pouvez pas ajouter vos propres gestionnaires d’événements pour fournir des fonctionnalités permettant d’ouvrir des fichiers supprimés.

Pour ajouter une gestion supplémentaire des événements glisser-déplacer dans ces contrôles, utilisez la AddHandler(RoutedEvent, Delegate, Boolean) méthode pour ajouter vos gestionnaires d’événements pour les événements glisser-déplacer. Définissez le handledEventsToo paramètre pour true que le gestionnaire spécifié soit appelé pour un événement routé qui a déjà été marqué comme géré par un autre élément le long de l’itinéraire d’événement.

Conseil

Vous pouvez remplacer la fonctionnalité de glisser-déplacer intégrée de TextBox, RichTextBoxet FlowDocument en gérant les versions d’aperçu des événements glisser-déplacer et en marquant les événements d’aperçu comme gérés. Toutefois, cela désactive la fonctionnalité de glisser-déplacer intégrée et n’est pas recommandée.

Exemple

L’exemple suivant montre comment ajouter des gestionnaires pour les événements et Drop les DragOver événements sur un RichTextBox. Cet exemple utilise la AddHandler(RoutedEvent, Delegate, Boolean) méthode et définit le handledEventsToo paramètre pour true que les gestionnaires d’événements soient appelés même si les RichTextBox marques de ces événements sont gérées. Le code dans les gestionnaires d’événements ajoute des fonctionnalités pour ouvrir un fichier texte supprimé sur le RichTextBox.

Pour tester cet exemple, faites glisser un fichier texte ou un fichier RTF (Rich Text Format) de l’Explorateur Windows vers l’explorateur RichTextBox. Le fichier est ouvert dans le RichTextBoxfichier . Si vous appuyez sur la touche Maj avant de supprimer le fichier, le fichier est ouvert sous forme de texte brut.

<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