2010-04-07 24 views
5

Tôi đang viết điều khiển người dùng trong WPF dựa trên ListBox hay không. Một trong những phần chính của chức năng là khả năng sắp xếp lại danh sách bằng cách kéo các mục xung quanh. Khi người dùng kéo một mục, tôi thay đổi các mục Opacity thành 50% và di chuyển vật thể trong một ObservableCollection trong ViewModel của tôi tùy thuộc vào nơi người dùng muốn. Trong sự kiện thả, tôi thay đổi Opacity trở lại 100%.Làm cách nào để biết một lần kéo/thả có bị hủy trong WPF

Vấn đề tôi gặp phải là nếu người dùng kéo mục đó ra khỏi tầm kiểm soát của tôi và thả nó ở một nơi khác thì tôi cần thay đổi Opacity trở lại 100% và di chuyển mục trở lại vị trí của nó khi người dùng bắt đầu kéo. Có sự kiện nào tôi có thể xử lý để nắm bắt hành động này không? Nếu không có cách nào xảo quyệt khác để giải quyết vấn đề này?

Trả lời

12

Giả sử bạn đang sử dụng chức năng kéo và thả tích hợp, bạn có thể sử dụng giá trị trả lại của phương thức DoDragDrop. Nếu mục tiêu thả không chấp nhận đối tượng đã kéo, thì DoDragDrop sẽ trả về DragDropEffects.None.

Điều này tất nhiên giả định rằng các điều khiển khác trên biểu mẫu của bạn không cho phép thả các mục trong danh sách của bạn.

+4

Tôi chưa bao giờ nhận ra rằng DragDrop.DoDragDrop là lời kêu gọi chặn. Nó không trở lại cho đến sau khi sự sụt giảm đã xảy ra (thành công hay cách khác). Rất hữu dụng! – Darren

+1

Holy crap +1 .... –

1

Tôi đã thực hiện việc này bằng trình kích hoạt sự kiện trong XAML trước đây. Trong trường hợp của tôi, chúng trong suốt (độ mờ 30%) trước và khi người dùng kéo qua, độ mờ được đặt thành 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> 

Các storyboards sau đó sẽ animate opacity

<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> 
Các vấn đề liên quan