Можете ли вы основать триггер на том, участвуете ли вы в событии перетаскивания? - PullRequest
0 голосов
/ 01 февраля 2012

Я хочу ввести Border через Trigger в ответ на перетаскивание по сравнению с простым наведением мыши.

Более конкретно, у нас есть список элементов, отображающий аппаратный порт (например,как порт 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 голосов
/ 01 февраля 2012

Вы можете использовать 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).

Удачи!

...