2010-04-07 6 views
5

ListBox를 기반으로하는 WPF에서 사용자 정의 컨트롤을 작성하고 있습니다. 기능의 주요 부분 중 하나는 항목을 드래그하여 목록을 재정렬하는 기능입니다. 사용자가 항목을 드래그하면 항목 Opacity이 50 %로 변경되고 사용자가 원하는 위치에 따라 내 ViewModel에서 ObservableCollection의 항목을 실제로 이동합니다. 드롭 이벤트에서 나는 Opacity을 다시 100 %로 바꿉니다.WPF에서 드래그/드롭이 취소되었는지 어떻게 알 수 있습니까?

내가 겪고있는 문제는 사용자가 내 컨트롤에서 항목을 드래그하여 다른 곳에 떨어 뜨리면 Opacity을 100 %로 다시 변경하고 사용자가 시작할 때의 항목으로 다시 이동해야한다는 것입니다. 끌기. 이 작업을 캡처하기 위해 처리 할 수있는 이벤트가 있습니까? 그렇지 않다면이 문제를 해결할 다른 교활한 방법이 있습니까?

답변

12

기본 제공되는 끌어서 놓기 기능을 사용한다고 가정 할 경우 DoDragDrop 메서드의 반환 값을 사용할 수 있습니다. 드롭 대상에서 드래그 한 객체를 허용하지 않으면 DoDragDrop은 DragDropEffects.None을 반환합니다.

물론 이것은 양식의 다른 컨트롤이 목록 항목 삭제를 허용하지 않는다고 가정합니다.

+4

불투명도를 애니메이션 것입니다. 삭제가 완료 될 때까지 (성공 또는 기타) 리턴되지 않습니다. 굉장히 유용하다! – Darren

+1

거룩한 쓰레기 +1 .... –

1

이전에 XAML에서 이벤트 트리거를 사용하여이 작업을 수행했습니다. 내 경우에는 사용자가 드래그하기 전과 후에 투명 (30 % 불투명)이었으며 불투명도는 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> 

스토리 보드는 내가 DragDrop.DoDragDrop가 차단 호출 것을 깨달았다 결코

<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> 
관련 문제