【问题标题】:WPF Highlight background when dragged over拖动时WPF突出显示背景
【发布时间】:2021-06-16 03:46:21
【问题描述】:

我已在我的应用程序中成功实现拖放。我现在正在努力改善用户体验。

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

我想出了这个几乎有效的方法,但它似乎有时会错过 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>

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

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    拖放作品是相当难以理解和烦人的事情。 拖动事件有时会被另一个控件消耗。
    特别是,如果您的 xaml 页面具有内容控制。内容控件有PreviewDragEnterPreviewDragLeavePreviewDragOver。您应该在其事件触发时调用以下源代码。 e.Handled = true.
    就我而言,我正准备通过拖放交互来移动 ListBox 项目的排序。列表框项包含 TextBoxComboBox,即 IsEditable=true 和 ContentControl。当鼠标悬停在拖动离开时,这些控件正在消耗拖动离开事件。所以我打电话给e.Handled = true。在这些控件的PreviewDragEnterPreviewDragLeavePreviewDragOver 事件上。

    【讨论】:

    • 您好,对不起,我不太明白这一点,在这种情况下如何处理事件及早提供帮助,以及如何从 XAML 中做到这一点。
    猜你喜欢
    • 2012-05-19
    • 2015-11-21
    • 1970-01-01
    • 2013-09-18
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多