Почему я не могу перетаскивать файлы из проводника в FlowDocumentReader и как это исправить?

Я пытаюсь реализовать часть функциональности, которая позволит пользователю перетаскивать файлы в приложение для открытия в FlowDocumentReader.

Моя проблема заключается в том, что хотя у меня AllowDrop=true в FlowDocumentReader, курсор не меняется на значок «перетащите сюда», а вместо этого меняется на значок «перетаскивание не разрешено». Это происходит только с FlowDocumentReader, все остальные части пользовательского интерфейса (само окно, другие элементы управления) работают должным образом. FlowDocumentReader на самом деле получает события, и можно обработать отбрасывание, но у пользователя нет визуальной индикации того, что он может здесь отпустить мышь.

Я также не могу скрыть курсор «перетаскивание не разрешено», установив Cursor=Cursors.None


person Sergey Aldoukhov    schedule 19.10.2009    source источник


Ответы (2)


Необходимо обработать событие DragOver в FlowDocument, чтобы разрешить перетаскивание сюда.

xaml:

<!--
<FlowDocumentReader x:Name="fdr" Background="White">
    <FlowDocument x:Name="doc" AllowDrop="True" DragEnter="doc_DragOver" Drop="doc_Drop" Background="White"/>
    </FlowDocumentReader>
-->
<FlowDocumentReader x:Name="fdr" Background="White">
   <FlowDocument x:Name="doc" AllowDrop="True" DragOver="doc_DragOver" Drop="doc_Drop" Background="White"/>
</FlowDocumentReader>

код позади:

private void doc_DragOver(object sender, DragEventArgs e)
{
    e.Effects = DragDropEffects.All;
    e.Handled = true;
}

private void doc_Drop(object sender, DragEventArgs e)
{
}
person gp.    schedule 11.01.2010
comment
Вы наверное не пробовали этот код, потому что он не работает - курсор не поворачивается сюда и не вызывается событие drop. - person Sergey Aldoukhov; 11.01.2010
comment
Извините, в xaml я вставил DragEnter. должен был быть DragOver. Поменяй и попробуй. - person gp.; 12.01.2010

Я не мог найти никакого прямого способа решить эту проблему, поэтому вот что у меня получилось:

  • Я разместил сетку поверх FlowDocumentReader. Эта сетка имеет проданный цвет, непрозрачность 0 (прозрачная) и видимость = свернута. Эта сетка предназначена для того, чтобы служить мишенью для перетаскивания.
  • Когда FlowDocument в FlowDocumentReader получает событие DragEnter, я переключаю видимость сетки на Visible. Сетка начинает получать события перетаскивания, а курсор остается в форме «перетащите сюда».
  • Когда сетка получает события Drop или DragLeave, ее видимость снова становится свернутой, чтобы позволить FlowDocument получать события мыши.

    <FlowDocumentReader x:Name="fdr" Grid.Row="1" Background="White">
        <FlowDocument x:Name="doc" DragEnter="doc_DragEnter" Background="White"/>
    </FlowDocumentReader>
    <Grid x:Name="dtg" Grid.Row="1" Background="White" Opacity="0"
        Drop="dtg_Drop" DragLeave="dtg_DragLeave" Visibility="Collapsed"/>
    
person Sergey Aldoukhov    schedule 20.10.2009