Click here to Skip to main content
13,256,482 members (59,122 online)
Click here to Skip to main content
Add your own
alternative version

Stats

36.4K views
486 downloads
21 bookmarked
Posted 16 Mar 2008

Implementing Drag Drop Operations for Browser Based WPF Applications (XBAP)

, 16 Mar 2008
Rate this:
Please Sign up or sign in to vote.
Simple implementation of Drag and Drop operation without full trust requirement

Introduction

In the article, "Very simple WPF Drag and Drop Sample without Win32 Calls", I stated that because of not using Win32 calls, the resulting code should also work in the browser under partial trust. Well... I was wrong. It turned out that DragDrop.DoDragDrop(...) function would throw a SecurityException in an XBAP application under partial trust since DragDrop.DoDragDrop originates a so called OLE Drag'n Drop operation. For most applications, when we are dragging and dropping only WPF objects, no OLE transfer is necessary. So in this article, I give an example of simulating the Drag'n Drop functionality without DragDrop.DoDragDrop method that runs in a browser.

Using the Code

To use the code, simply unzip the file, start the project, compile and run the application.

There are two interesting things I had to figure out in order to make the application work in a browser: making sure that the picture of the cursor is visible and adopts a shape that we want. Both are implemented in ListView1_MouseMove callback for ListView1.MouseMove event.

To make the cursor visible, we simply do:

Mouse.SetCursor(Cursors.Hand);        

There is a problem that remains, however: I wanted the cursor to become a rectangle and there were no rectangle shapes among Cursors enumeration. And to top it all, you cannot use a bitmap image for a cursor in an XBAP partial trust application. To get around this problem, I made the cursor to be a semi-transparent rectangle visible only for the duration of the drag operation:

<Rectangle

    Name="CursorRectangle"

    Height="10" 

    Width="20" 

    Visibility="Hidden">
    <Rectangle.Fill>
        <SolidColorBrush Color="Blue" 

             Opacity="0.35"/>
    </Rectangle.Fill>
</Rectangle>

The following code ensures that the cursor rectangle does not move outside of the ListView control boundaries:

Point p = e.GetPosition(ListView1); // get the location of the mouse pointer

// get the boundaries of the ListView control (the cursor should not 
// be allowed to go beyond those boundaries
Rect bounds = VisualTreeHelper.GetDescendantBounds(ListView1); 

// set the vertical coordinate of the cursor to 
// coincide with the current mouse vertical coordinate
// as long as we are still within the boundaries of the 
// ListView control
if ( (bounds.Top < p.Y) && (bounds.Bottom > p.Y))
{
    Canvas.SetTop(CursorRectangle, p.Y);
}

// set the vertical coordinate of the cursor to 
// coincide with the current mouse horizontal coordinate
// as long as we are still within the boundaries of the 
// ListView control
if ((bounds.Left < p.X) && (bounds.Right > p.X))
{
    Canvas.SetLeft(CursorRectangle, p.X);
}

The rest of the code is very similar to that of "Very simple WPF Drag and Drop Sample without Win32 Calls" article.

History

  • 16th March, 2008: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Nick Polyak
Architect AWebPros
United States United States
No Biography provided

You may also be interested in...

Pro
Pro

Comments and Discussions

 
-- There are no messages in this forum --
Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.171114.1 | Last Updated 16 Mar 2008
Article Copyright 2008 by Nick Polyak
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid