你可以根据你是否参与拖拽事件来触发?

时间:2012-02-01 01:36:39

标签: wpf triggers drag-and-drop datatemplate

我希望通过BorderTrigger设置样式,以响应被拖动而不是简单的鼠标悬停。

更具体地说,我们有一个项目列表,显示硬件端口(如端口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吗?

1 个答案:

答案 0 :(得分:0)

您可以使用DataTrigger。您将在viewmodel中创建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>

在codebehind中:

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);
    }

在我的简短测试中,这似乎非常可靠。而不是更改背景颜色,而是更改viewmodel上的属性(反过来触发DataTrigger)。

祝你好运!