【问题标题】:Can you base a trigger on whether you're in a drag event?您可以根据您是否处于拖动事件中来触发吗?
【发布时间】:2012-06-29 15:23:32
【问题描述】:

我想通过Trigger 设置Border 的样式,以响应被拖动和简单的鼠标悬停。

更具体地说,我们有一个显示硬件端口(例如端口 1、端口 2 等)的项目列表,然后在它旁边显示连接到该端口的设备。对于正常的鼠标悬停事件,我们希望突出显示设备。但是,如果我们在拖放操作中,我们希望突出显示端口。

例如,这里有一些虚假的 MultiTriggers 描述了我想要做什么。它使用了一个名为IsDragInProgress 的虚假属性,我在这个例子中做了这个。这就是我想要实现的目标。

<DataTemplate x:Key="TestTemplate">

    <DockPanel>

        <Border x:Name="PortHighlight" DockPanel.Dock="Left">
            <TextBlock>
                <Run Text="{Binding PortName}" />
                <Run Text=": " />
            </TextBlock>
        </Border>

        <Border x:Name="DeviceHighlight">
            <TextBlock Text="{Binding DeviceName}" />
        </Border>

    </DockPanel>

    <DataTemplate.Triggers>

        <MultiTrigger>

            <MultiTrigger.Conditions>
                <Condition Property="IsMouseOver" Value="True" />
                <Condition Property="IsDragInProgress" Value="False" />
            </MultiTrigger.Conditions>

            <Setter TargetName="DeviceHighlight" Property="Background" Value="Yellow" />

        </MultiTrigger>

        <MultiTrigger>

            <MultiTrigger.Conditions>
                <Condition Property="IsMouseOver" Value="True" />
                <Condition Property="IsDragInProgress" Value="True" />
            </MultiTrigger.Conditions>

            <Setter TargetName="PortHighlight" Property="Background" Value="Yellow" />

        </MultiTrigger>

    </DataTemplate.Triggers>

</DataTemplate>

那么这可以做到吗?有没有我可以投票的现有财产来代替虚假的IsDragInProgress

【问题讨论】:

  • 我不相信 OnEnter 与您是否拖动有任何关系,因为它以任何一种方式触发。另外,这是一个事件,而不是一个属性,对吗?同样,我正在寻找可以测试是否拖拽的东西。

标签: wpf triggers drag-and-drop datatemplate


【解决方案1】:

您可以使用DataTrigger。您将在视图模型中创建 IsDragInProgress 属性。然后,您必须在拖动开始和结束时打开/关闭该属性。

编辑:

<Grid x:Name="LayoutRoot">
    <Border x:Name="border" AllowDrop="True" Drop="border_Drop" DragEnter="border_DragEnter" DragLeave="border_DragLeave" Background="White"></Border>
    <Ellipse Height="50" Width="50" Fill="Green" MouseMove="Ellipse_MouseMove" />
</Grid>

在代码隐藏中:

private void Ellipse_MouseMove(object sender, MouseEventArgs e)
    {
        Ellipse ellipse = sender as Ellipse;
        if (ellipse != null && e.LeftButton == MouseButtonState.Pressed)
        {
            DragDrop.DoDragDrop(ellipse,
                                 ellipse.Fill.ToString(),
                                 DragDropEffects.Copy);
        }
    }

    private void border_DragEnter(object sender, DragEventArgs e)
    {
        border.Background = new SolidColorBrush(Colors.Blue);
    }

    private void border_DragLeave(object sender, DragEventArgs e)
    {
        border.Background = new SolidColorBrush(Colors.White);
    }

    private void border_Drop(object sender, DragEventArgs e)
    {
        border.Background = new SolidColorBrush(Colors.White);
    }

在我的简短测试中,这似乎相当可靠。不要更改背景颜色,而是更改视图模型上的属性(这反过来会触发 DataTrigger)。

祝你好运!

【讨论】:

  • 这种方法的问题是负责启动拖动的每一件事都必须设置它,而终止拖动的所有事情都必须清除它。另外,您如何处理开始拖动但在完成之前取消拖动的情况?我真的很惊讶没有办法只问框架'嘿......现在有人在拖东西吗?'
  • 这可能是个问题...但我很快尝试了一个基于代码here 的 wpf 应用程序。我在 DragEnter 中将放置目标(边框)区域的颜色更改为蓝色,然后在 DragLeave 和 Drop 事件中将其更改回白色。在处理这些事件时,我无法将其愚弄成保持蓝色……但我不能说它是万无一失的……希望您找到解决方案。
  • 如果你不离开或放弃怎么办? IE。按 Esc 取消拖动?实际上,您是否有机会发布您所指的代码(或用它更新上面的代码?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多