Click here to Skip to main content
15,890,282 members
Articles / Desktop Programming / WPF
Article

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

Rate me:
Please Sign up or sign in to vote.
4.71/5 (6 votes)
16 Mar 2008CPOL2 min read 44.8K   522   21  
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:

C#
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:

XML
<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:

C#
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)


Written By
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 fell in love with WPF (and later Silverlight) at first sight. After Microsoft killed Silverlight, I was distraught until I found Avalonia - a great multiplatform package for building UI on Windows, Linux, Mac as well as within browsers (using WASM) and for mobile platforms.

I have my Ph.D. from RPI.

here is my linkedin profile

Comments and Discussions

 
-- There are no messages in this forum --