Я не уверен, что лямбда-выражение решит проблему с автоматической отменой регистрации ручки мыши.
Я переписал решение немного по-другому.
protected override void OnItemDragStarting( ItemDragEventArgs eventArgs )
{
Application.Current.RootVisual.CaptureMouse();
MouseButtonEventHandler handlerMouseUp = null;
handlerMouseUp = ( s, ee ) =>
{
this.ReleaseMouseCapture();
if ( handlerMouseUp != null )
{
Application.Current.RootVisual.MouseLeftButtonUp -= handlerMouseUp;
}
Point p = ee.GetPosition( Application.Current.RootVisual );
if ( VisualTreeHelper.FindElementsInHostCoordinates( p, Application.Current.RootVisual ).Count() == 0 )
{
// If mouse is released outside of the Silverlight control, cancel the drag
eventArgs.Cancel = true;
eventArgs.Handled = true;
}
};
Application.Current.RootVisual.MouseLeftButtonUp += handlerMouseUp;
if ( !eventArgs.Handled )
base.OnItemDragStarting( eventArgs );
}
В моем случае я также расширил класс TreeViewDragDropTarget. Надеюсь, что это будет с надеждой для кого-то.