2010-04-07 17 views
5

Sto scrivendo un controllo utente in WPF basato su un ListBox. Una delle principali funzionalità è la possibilità di riordinare l'elenco trascinando gli oggetti in giro. Quando un utente trascina un oggetto, modifica gli articoli Opacity al 50% e sposta fisicamente l'elemento in un ObservableCollection nel mio ViewModel a seconda di dove l'utente lo desidera. Nell'evento di rilascio cambio lo Opacity al 100%.Come faccio a sapere se un trascinamento è stato annullato in WPF

Il problema che ho è che se l'utente trascina la voce fuori dal mio controllo e cade da qualche altra parte poi ho bisogno di cambiare il Opacity nuovamente al 100% e spostare l'articolo di nuovo dove era quando l'utente ha avviato la resistenza. C'è un evento che posso gestire per catturare questa azione? Se no c'è qualche altro modo furbo per risolvere questo problema?

risposta

12

Supponendo che si stia utilizzando la funzionalità di trascinamento della selezione incorporata, è possibile utilizzare il valore restituito del metodo DoDragDrop. Se la destinazione di rilascio non accetta l'oggetto trascinato, DoDragDrop restituisce DragDropEffects.None.

Questo ovviamente presuppone che gli altri controlli del modulo non consentano il rilascio degli elementi dell'elenco.

+4

ho mai capito che DragDrop.DoDragDrop era una chiamata di blocco. Non ritorna fino a quando non si è verificata la caduta (riuscita o meno). Molto utile! – Darren

+1

Santo schifo +1 .... –

1

Ho fatto questo utilizzando trigger di eventi in XAML prima. Nel mio caso, erano trasparenti (30% di opacità) prima e quando l'utente si trascina, l'opacità è impostata al 100%.

<EventTrigger RoutedEvent="DragDrop.DragEnter"> 
    <BeginStoryboard Storyboard="{StaticResource FadeInStoryboard}" x:Name="FadeInStoryboard_BeginStoryboard1"/> 
</EventTrigger> 
<EventTrigger RoutedEvent="DragDrop.DragLeave"> 
    <BeginStoryboard Storyboard="{StaticResource FadeOutStoryboard}" x:Name="FadeOutStoryboard_BeginStoryboard1"/> 
</EventTrigger> 

Gli storyboard sarebbe poi animare l'opacità

<Storyboard x:Key="FadeInStoryboard"> 
    <DoubleAnimation To="1" Duration="0:00:00.2" Storyboard.TargetName="UserControl" Storyboard.TargetProperty="(UIElement.Opacity)" /> 
</Storyboard> 
<Storyboard x:Key="FadeOutStoryboard"> 
    <DoubleAnimation To="0.3" Duration="0:00:00.2" Storyboard.TargetName="UserControl" Storyboard.TargetProperty="(UIElement.Opacity)" /> 
</Storyboard> 
Problemi correlati