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
.NET Desktop feedback