WPF拖动时高亮显示背景



我已经成功地在应用程序中实现了拖放。安现在正致力于改善用户体验。

我的目标是当拖动开始突出我可能的目标时,然后如果它们被拖动,则会变为不同的颜色。

我想出了这个几乎有效的方法,但有时似乎会错过DragLeave事件。该样式适用于我的任何控件,这些控件被用作投放目标(多种类型(

<Style x:Key="HighlightDrop">
<Setter Property="Control.Background" Value="Orange" /> <!-- usually set to transparent, just set to orange here to make it obvious-->
<Style.Triggers>
<EventTrigger RoutedEvent="UIElement.DragEnter">
<BeginStoryboard x:Name="Highlight">
<Storyboard>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="Background.Color" 
Duration="0:0:0">
<DiscreteColorKeyFrame Value="LightGreen" KeyTime="0:0:0" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="UIElement.DragLeave">
<StopStoryboard BeginStoryboardName="Highlight" />
</EventTrigger>
<DataTrigger Binding="{Binding AmDragging, RelativeSource={RelativeSource AncestorType=Window}}" Value="True" >
<Setter Property="Control.Background" Value="LightBlue" />
</DataTrigger>
</Style.Triggers>
</Style>

然后我尝试了一种不同的方法,但这并没有奏效,因为IsMouseOver事件在拖动过程中似乎不起作用。

<Style x:Key="HighlightDrop">
<Setter Property="Control.Background" Value="Orange" />
<!-- usually set to transparent, just set to orange here to make it obvious-->
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding AmDragging, RelativeSource={RelativeSource AncestorType=Window}}" Value="True" />
<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Control}}" Value="True" />
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="Control.Background" Value="LightGreen" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
<DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=Control}}" Value="True" > <!-- Just used to test that the binding for IsMouseOver is working -->
<Setter Property="Control.Background" Value="Red" />
</DataTrigger>
<DataTrigger Binding="{Binding AmDragging, RelativeSource={RelativeSource AncestorType=Window}}" Value="True" >
<Setter Property="Control.Background" Value="LightBlue" />
</DataTrigger>
</Style.Triggers>
</Style>

我在这里缺少的是什么,感觉就像我在重新发明轮子,而这份工作本应该是非常基础的。

拖放工作是一件很难理解和令人讨厌的事情。拖动事件有时会被另一个控件占用
尤其是当您的xaml页面具有内容控制时。内容控制具有PreviewDragEnterPreviewDragLeavePreviewDragOver。当事件触发时,您应该调用以下源代码。e.Handled = true
在我的案例中,我正要通过拖放交互来移动ListBox项目排序。ListBox项包含TextBox、IsEditable=true的ComboBoxContentControl。当鼠标在拖动离开时,这些控件正在消耗拖动离开事件。所以我叫了e.Handled = true。关于这些控件的PreviewDragEnterPreviewDragLeavePreviewDragOver事件。