Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Raise DropCompleted / DragCompleted #14

Closed
punker76 opened this issue Feb 18, 2013 · 4 comments
Closed

Raise DropCompleted / DragCompleted #14

punker76 opened this issue Feb 18, 2013 · 4 comments

Comments

@punker76
Copy link
Owner

Original author: sportfr...@gmail.com (May 06, 2010 13:07:45)

Is it possible to implement raise events DropCompleted and DragCompleted?
In the args info about the source, target and data, or just DropInfo.

Thanks,

Frank

Original issue: http://code.google.com/p/gong-wpf-dragdrop/issues/detail?id=14

@punker76
Copy link
Owner Author

From gro...@gmail.com on May 11, 2010 23:22:57
Is this related to Issue #4: Move only?

Where should DropCompleted and DragCompleted be raised? On the drag source or the drop
target?

My proposed fix to issue #4 is to add a DragCompleted method to the IDragSource
interface which accepts a DropInfo. Would this suffice? What would DropCompleted add
that isn't already present?

@punker76
Copy link
Owner Author

From sportfr...@gmail.com on May 12, 2010 16:26:37
No, this has nothing to do with #4.

I want to call a method after a drag is completed in the main application itself, and
not in a seperate class.

Normally a drop/drop event fires a DragDrop event at the end, see
http://msdn.microsoft.com/en-us/library/aa289508%28VS.71%29.aspx. But your component
doesn’t.

This is a hint of what I’m thinking of. Not tested, but copied from something else I
created, I think you should change the treeview in a DependencyObject.

public static readonly RoutedEvent DragCompletedEvent = EventManager.RegisterRoutedEvent(
"DragCompleted",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(TreeViewExtensions)
);
private static void RaiseDragCompleted(System.Windows.Controls.TreeView tree)
{
if (DragCompletedEvent != null)
tree.RaiseEvent(new RoutedEventArgs(DragCompletedEvent, null));
}

And called in:
static void DropTarget_PreviewDrop(object sender, DragEventArgs e)
{
….
RaiseDragCompleted(tree);
e.Handled = true;
}

@punker76
Copy link
Owner Author

From sportfr...@gmail.com on March 08, 2011 13:36:40
Hi Steven,

I don't know if you have implemented this already.

I have a LINQ datasource as ItemsSource and converted as List (not an ObservableCollection). After a drop the items are not refreshed. Could you please add the following lines to DragDrop.cs? It will add a new event DropCompleted that will be fired after the drop is completed.

  1. Just before "public static class DragDrop":
    public delegate void DragCompletedEventHandler(object sender, DragCompletedEventArgs e);

  2. At the end, as a new class:
    public class DragCompletedEventArgs : RoutedEventArgs
    {
    public DragCompletedEventArgs(DragInfo dragInfo)
    {
    this.draginfo = dragInfo;
    }
    public readonly DragInfo draginfo;
    }

  3. After "public static readonly DependencyProperty IsDropTargetProperty =":
    public static readonly RoutedEvent DragCompletedEvent = EventManager.RegisterRoutedEvent(
    "DragCompleted",
    RoutingStrategy.Bubble,
    typeof(DragCompletedEventHandler),
    typeof(DragDrop)
    );

    // Provide CLR accessors for the event
    public static void AddDragCompletedHandler(DependencyObject dependencyObject, DragCompletedEventHandler handler)
    {
        UIElement element = dependencyObject as UIElement;
        if (element != null)
        {
            element.AddHandler(DragCompletedEvent, handler);
        }
    }
    
    public static void RemoveDragCompletedHandler(DependencyObject dependencyObject, DragCompletedEventHandler handler)
    {
        UIElement element = dependencyObject as UIElement;
        if (element != null)
        {
            element.RemoveHandler(DragCompletedEvent, handler);
        }
    }
    
  4. At the end of "static void DropTarget_PreviewDrop(object sender, DragEventArgs e)", just before "e.Handled = true;":
    if (DragCompletedEvent != null)
    {
    DragCompletedEventArgs dragCompletedArgs = new DragCompletedEventArgs(m_DragInfo);
    dragCompletedArgs.RoutedEvent = DragCompletedEvent;
    m_DragInfo.VisualSource.RaiseEvent(dragCompletedArgs);
    }

In my application I then have the following:
private void datagrid_DragCompleted(object sender, DragCompletedEventArgs e)
{
datagrid.Items.Refresh();
}

Once again thank you for this nice component,

Frank

@punker76
Copy link
Owner Author

punker76 commented Aug 7, 2013

this should be going with the Drop function at IDropTarget

@punker76 punker76 closed this as completed Aug 7, 2013
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant