Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
No Windows Presentation Foundation (WPF), os controles TextBox, RichTextBoxe FlowDocument têm a funcionalidade interna de arrastar e soltar. A funcionalidade interna permite arrastar e soltar texto dentro e entre os controles. No entanto, ele não permite abrir um arquivo soltando o arquivo no controle. Esses controles também marcam os eventos de arrastar e soltar como manipulados. Como resultado, por padrão, você não pode adicionar seus próprios manipuladores de eventos para fornecer funcionalidade para abrir arquivos descartados.
Para adicionar manipulação adicional para eventos de arrastar e soltar nesses controles, use o método AddHandler(RoutedEvent, Delegate, Boolean) para adicionar seus manipuladores de eventos para os eventos de arrastar e soltar. Defina o parâmetro handledEventsToo como true para que o manipulador especificado seja invocado para um evento roteado que já tenha sido marcado como manipulado por outro elemento ao longo da rota do evento.
Sugestão
Você pode substituir a funcionalidade interna de arrastar e soltar do TextBox, RichTextBoxe FlowDocument manipulando as versões de visualização dos eventos de arrastar e soltar e marcando os eventos de visualização como manipulados. No entanto, isso desativará a funcionalidade interna de arrastar e soltar e não é recomendado.
Exemplo
O exemplo a seguir demonstra como adicionar manipuladores para os eventos DragOver e Drop em um RichTextBox. Este exemplo usa o método AddHandler(RoutedEvent, Delegate, Boolean) e define o parâmetro handledEventsToo como true para que os manipuladores de eventos sejam invocados mesmo que o RichTextBox marque esses eventos como manipulados. O código nos manipuladores de eventos adiciona funcionalidade para abrir um ficheiro de texto que é largado no RichTextBox.
Para testar este exemplo, arraste um ficheiro de texto ou um ficheiro RTF (rich text format) do Explorador do Windows para o RichTextBox. O arquivo será aberto no RichTextBox. Se você pressionar a tecla SHIFT antes de soltar o arquivo, o arquivo será aberto como texto sem formatação.
<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
.NET Desktop feedback