Запустить EventTrigger с помощью AttachedEvent

У меня есть обычай Panel что поднимает RoutedEvent который определен глобально в статическом классе:

 public class CompressItemsToFitStackPanel : StackPanel
 {
    protected override Size ArrangeOverride(Size arrangeSize)
    {        
        // some logic 
        // Raise Attached Event     
        CustomEventManager.RaiseArrangeEvent(this);
        return base.ArrangeOverride(arrangeSize); 
    }         
 }

Мой прилагается Event:

 public static class CustomEventManager
{                        
    public static readonly RoutedEvent ArrangeEvent = EventManager.RegisterRoutedEvent("Arrange",
                                RoutingStrategy.Bubble,
                                typeof(RoutedEventHandler),
                                typeof(CustomEventManager));

    internal static void RaiseArrangeEvent(UIElement target)
    {
        var args = new RoutedEventArgs(ArrangeEvent);
        target.RaiseEvent(args);            
    }       
} 

эта панель - панель элементов для элемента управления Items, шаблон ItemsTemplate в качестве EventTrigger, который я не хочу запускать при возникновении присоединенного события:

  <DataTemplate DataType="{x:Type local:Checker}" x:Key="CheckerTempalte">

    <Ellipse x:Name="ellipse" Style="{StaticResource checkerStyle}">
        <Ellipse.Triggers>
            <EventTrigger RoutedEvent="local:CustomEventManager.Arrange">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimationUsingKeyFrames 
                                    Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" 
                                    Storyboard.TargetName="ellipse"
                                >
                            <EasingDoubleKeyFrame KeyTime="0:0:0" Value="0" />
                            <EasingDoubleKeyFrame KeyTime="0:0:1" Value="{Binding Val}" />
                        </DoubleAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>                    
        </Ellipse.Triggers>        
    </Ellipse>

Триггер события не сработал,

Возможно, я не использую AttachedEvents правильно, или он не объявлен правильно, мне нужно событие из панели для распространения и запуска EventTriggers в дочерних элементах,

какие-либо идеи, что я делаю не так?

РЕДАКТИРОВАТЬ:

После понимания dkozl я пришел к выводу, что мне нужны AddXXXHandler и RemoveXXXHandler, чтобы XAML мог добавить / удалить обработчик для EventTrigger.

    public static void AddArrangeHandler(DependencyObject d, RoutedEventHandler handler)
    {
        UIElement uie = d as UIElement;
        if (uie != null)
        {
            uie.AddHandler(CustomEventManager.ArrangeEvent, handler);
        }
    }

    public static void RemoveArrangeHandler(DependencyObject d, RoutedEventHandler handler)
    {
        UIElement uie = d as UIElement;
        if (uie != null)
        {
            uie.RemoveHandler(CustomEventManager.ArrangeEvent, handler);
        }
    } 

но все равно ничего не происходит, и я никогда не достигаю этих методов.

РЕДАКТИРОВАТЬ 2:

благодаря комментариям dkozl ниже,

Событие вызывается для каждого дочернего элемента, так как он эллипсами вниз по дереву визуалов.

  protected override Size ArrangeOverride(Size arrangeSize)
  {                    
      foreach (UIElement child in children)
      {                        
           CustomEventManager.RaiseArrangeEvent(child);                                            
      } 
  }

но пока ничего не происходит, я также проверил StoryBoard, предоставив EventTrigger событие MouseEnter и наведя указатель мыши на элемент, он работает нормально.

все-таки даже поднятие события на каждом эллипсе все равно не работает... есть идеи?

Другим интересным моментом является то, что дочерние элементы на самом деле являются типом "Checker", а не эллипсом, который представляет DataTemplate, я не понимаю, как "Checker" считается UIElement .

2 ответа

То, что вы создали, является стандартным RoutedEvent, а не прикрепленный. Обработчик добавления / удаления отличается для прикрепленных событий. Вам понадобятся два отдельных метода (AddArrangeChildrenHandler и RemoveArrangeChildrenHandler). Это было объяснено на сайте MSDN

ОБНОВЛЕНИЕ: я скопировал обновленный Ellipse определение и CustomEventManager класс в мое приложение, добавлена ​​кнопка тестирования, которая вызывает CustomEventManager.RaiseArrangeEvent(ellipse); когда нажал и у меня работает.

Я также должен был добавить Ellipse.RenderTransorm из TransformGroupчетвертая трансформация существа TranslateTransform чтобы это работало как в примере

ОБНОВЛЕНИЕ 2: Событие возникает на панели, где Ellipse помещается, что означает, что событие пузырьков никогда не достигнет его, поскольку оно начнется с панели и поднимется по визуальному дереву к Window никогда не доходя до детей панели

Возможно, вы должны рассмотреть только код подход к этой проблеме. Если вы хотите определить анимации в XAML, вы можете, возможно, StaticResource их в свойствах на CompressToFitStackPanel. Но если ваш DataTemplate ссылается на конкретное преобразование по индексу, вы определенно теряете мощь и абстракцию DataTemplate.

Пересмотрите свое проблемное пространство и то, что дизайн должен решить. Используйте ILSpy или Reflector для анализа того, как другие панели решали проблемы со свойствами или со свойствами присоединенной зависимости (Grid.Column, Grid.Row).

Возьмите больше нагрузки на новую панель макета и меньше на тех, кто ее использует.

Удачи.

Другие вопросы по тегам