Click here to Skip to main content
14,604,347 members

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

Rate this:
4.71 (6 votes)
Please Sign up or sign in to vote.
4.71 (6 votes)
16 Mar 2008CPOL
Simple implementation of Drag and Drop operation without full trust requirement
Image 1

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
I am a software architect and a developer with great passion for new engineering solutions and finding and applying design patterns.

I am passionate about learning new ways of building software and sharing my knowledge with others.

I worked with many various languages including C#, Java and C++.

I have my Ph.D. from RPI.

here is my linkedin profile - I'll be happy to connect!

Comments and Discussions

 
-- There are no messages in this forum --
Article
Posted 16 Mar 2008

Stats

42.9K views
21 bookmarked