Как мы можем активировать триггер WPF в XAML, когда происходит операция перетаскивания? - PullRequest
3 голосов
/ 12 декабря 2010

Мы ищем способ для создания триггера WPF в XAML, независимо от того, выполняем ли мы операцию перетаскивания. В зависимости от того, хотим мы этого или нет, нам нужны разные способы зависания, поэтому это необходимо.

Единственный способ, о котором я могу думать, - это обрабатывать события начала и окончания перетаскивания и вручную отслеживать состояние, но для этого требуется код, а не чистый XAML. Кроме того, это похоже на полное излишество, тем более что нам придется делать это на каждой потенциальной цели падения, что является настоящей болью.

Так есть ли простой способ сказать: "Эй ... Я нахожусь в операции перетаскивания, поэтому сделайте этот триггер активным" или мне не повезло здесь?


Обновление

Чтобы уточнить, что мы пытаемся сделать, в настоящее время в чистом XAML вы можете создать стиль, а затем установить триггер стиля, чтобы проверить свойство IsMouseOver, например, нарисовать подсветку фона. Ну, мы хотим сделать это, но мы хотим сказать, если IsMouseOver имеет значение true и , если IsDragging = true, тогда примените этот триггер.

Ответы [ 3 ]

2 голосов
/ 30 января 2015

У меня только что была эта проблема, мое решение состоит в использовании присоединенного свойства, которое предоставляет недостающее IsDragging:

  1. Определить прилагаемый объект недвижимости

    public static readonly DependencyProperty IsDraggingProperty =
        DependencyProperty.RegisterAttached
        (
            "IsDragging",
            typeof(bool),
            typeof(ClassContainingThisProperty),
            new UIPropertyMetadata(false)
        );
    
    public static bool GetIsDragging(DependencyObject source)
    {
        return (bool)source.GetValue(IsDraggingProperty);
    }
    
    public static void SetIsDragging(DependencyObject target, bool value)
    {
        target.SetValue(IsDraggingProperty, value);
    }
    
  2. Создайте методы этого расширения, чтобы помочь вам установить свойство

    public static TParent FindParent<TParent>(this DependencyObject child) where TParent : DependencyObject
    {
        DependencyObject current = child;
        while(current != null && !(current is TParent))
        {
            current = VisualTreeHelper.GetParent(current);
        }
        return current as TParent;
    }
    
    public static void SetParentValue<TParent>(this DependencyObject child, DependencyProperty property, object value) where TParent : DependencyObject
    {
        TParent parent = child.FindParent<TParent>();
        if(parent != null)
        {
            parent.SetValue(property, value);
        }
    }
    
  3. Обрабатывать события DragDrop в соответствии с используемым элементом управления (например, ListView), чтобы установить присоединенное свойство для элементов.

    private void OnDragEnter(object sender, DragEventArgs e)
    {
        DependencyObject source = e.OriginalSource as DependencyObject;
        if (source != null)
        {
            source.SetParentValue<ListViewItem>(ClassContainingTheProperty.IsDraggingProperty, true);
        }
    }
    
    private void OnDragLeave(object sender, DragEventArgs e)
    {
        DependencyObject source = e.OriginalSource as DependencyObject;
        if(source != null)
        {
            source.SetParentValue<ListViewItem>(ClassContainingTheProperty.IsDraggingProperty, false);
        }
    }
    
    private void OnDrop(object sender, DragEventArgs e)
    {
        DependencyObject source = e.OriginalSource as DependencyObject;
        if(source != null)
        {
            source.SetParentValue<ListViewItem>(ClassContainingTheProperty.IsDraggingProperty, false);
        }
    }
    
  4. Использование свойства в вашем триггере

    <ControlTemplate TargetType="{x:Type ListViewItem}">
      <ControlTemplate.Triggers>
        <Trigger Property="namespace:ClassContainingTheProperty.IsDragging" Value="True">
          <Setter Property="Background" Value="White" />
          <Setter Property="BorderBrush" Value="Black" />
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
    
0 голосов
/ 15 июля 2011

если это настоящее событие DragDrop, просто наблюдайте за событием DragOver ...

            <EventTrigger RoutedEvent="DragOver">
                <BeginStoryboard>
                    <Storyboard Storyboard.TargetProperty="Fill.Color">
                        <ColorAnimation From="White" To="Black" Duration="0:0:1" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
0 голосов
/ 17 июня 2011

Я только когда-либо видел перетаскивание, реализованное с помощью обработчиков событий, поэтому я думаю, что вам не повезло. Я предлагаю вам создать собственное свойство зависимостей, чтобы указать, что происходит перетаскивание.

...