views:

157

answers:

2

I'm trying to implement a piece of functionality that will let the user to drag files into an application to be opened in the FlowDocumentReader.

My problem is that is though I have AllowDrop=true on the FlowDocumentReader, the cursor does not change to the "drop here" icon but changes instead to "drop is not allowed" icon. This happens only to the FlowDocumentReader, all other parts og the UI (window itself, other controls) work as expected. The FlowDocumentReader actually receives the events, and it is possible to handle the drop, but the user does not have a visual indication that he can release the mouse here.

I also cannot hide the "drop is not allowed" cursor by setting Cursor=Cursors.None

A: 

I couldn't find any direct way to solve this, so here is what I have ended up with:

  • I placed a grid on top of the FlowDocumentReader. This grid has a sold color, opacity of 0 (transparent) and Visibility=Collapsed. The purpose of this grid is to serve as a drop target.
  • When FlowDocument within the FlowDocumentReader received the DragEnter event, I switch the grid's visibility to Visible. The grid starts receiving drag events and the cursor stays in the "drop here" form.
  • When grid receives Drop or DragLeave events, its visibility is turned back to Collapsed to allow the FlowDocument receive mouse events

    <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"/>
    
Sergey Aldoukhov
+1  A: 

Need to handle DragOver event in FlowDocument to allow dropping here.

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>

code behind:

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

    private void doc_Drop(object sender, DragEventArgs e)
    {
    }
gp
You probably did not try this code, because it does not work - the cursor does not turn to "drop here" and drop event is not called.
Sergey Aldoukhov
Sorry in xaml I pasted "DragEnter". should have been "DragOver". Change it and try.
gp
Works with DragOver! Thanks.
Sergey Aldoukhov