Search code examples
c#wpfeventsrouted-events

Handle Custom RoutedEvent in Event Trigger


I have the following tree MainWindow -> Custom UserControl -> GroupBox -> ViewBox

I've added a Custom Routed Event to the UserControl, as :

  public static readonly RoutedEvent ConnectedEvent =
        EventManager.RegisterRoutedEvent("Connected", RoutingStrategy.Tunnel,
        typeof(RoutedEventHandler), typeof(IQMasterControl));

    public event RoutedEventHandler Connected
    {
        add { AddHandler(IQMasterControl.ConnectedEvent, value); }
        remove { RemoveHandler(IQMasterControl.ConnectedEvent, value); }
    }

The invocation of the event is following:

 _masterViewModel.Connected += delegate ()
        {
            RoutedEventArgs ea = new RoutedEventArgs(IQMasterControl.ConnectedEvent, this);
            this.RaiseEvent(ea);
        };

I want to run some animation on ViewBox on "Connected" event using Event Trigger:

<Viewbox VerticalAlignment="Center"
                      Child="{StaticResource PDataIco}"
                      RenderTransformOrigin="0.5, 0.5" Stretch="Uniform">
                        <Viewbox.RenderTransform>
                            <!--  the transform a name tells the framework not to freeze it  -->
                            <RotateTransform x:Name="noFreeze" />
                        </Viewbox.RenderTransform>
                        <Viewbox.Triggers>
                            <EventTrigger RoutedEvent="local:IQMasterControl.Connected">
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation RepeatBehavior="Forever" Storyboard.TargetProperty="(Rectangle.RenderTransform).(RotateTransform.Angle)" To="360" Duration="0:0:1" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </Viewbox.Triggers>
                    </Viewbox>

I have checked that the event is raised, but ViewBox does not seem to be receiving the event. So, no animation is started.

If I change the RoutedEvent property of the EventTrigger to another (f.e. Loaded) the animation works fine.

Can anyone help me on this?


Solution

  • You are raising the event for the UserControl.

    It is not raised for the ViewBox.

    There are two ways to go:

    Both require adding name for the ViewBox:

    <Viewbox VerticalAlignment="Center" x:Name="ViewBox"
                      Child="{StaticResource PDataIco}"
                      RenderTransformOrigin="0.5, 0.5" Stretch="Uniform">
                        <Viewbox.RenderTransform>
                            <!--  the transform a name tells the framework not to freeze it  -->
                            <RotateTransform x:Name="noFreeze" />
                        </Viewbox.RenderTransform>
                        <Viewbox.Triggers>
                            <EventTrigger RoutedEvent="local:IQMasterControl.Connected">
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation RepeatBehavior="Forever" Storyboard.TargetProperty="(Rectangle.RenderTransform).(RotateTransform.Angle)" To="360" Duration="0:0:1" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger>
                        </Viewbox.Triggers>
    </Viewbox>
    

    1.Raise it for the ViewBox:

    _masterViewModel.Connected += delegate ()
        {
            RoutedEventArgs ea = new RoutedEventArgs(IQMasterControl.ConnectedEvent, this);
            ViewBox.RaiseEvent(ea);
        };
    

    OR

    2.Handle it in UserControl:

    <UserControl.Triggers>
        <EventTrigger RoutedEvent="local:IQMasterControl.Connected">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation RepeatBehavior="Forever" Storyboard.Target="{Binding ElementName=Viewbox}" Storyboard.TargetProperty="(Rectangle.RenderTransform).(RotateTransform.Angle)" To="360" Duration="0:0:1" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </UserControl.Triggers>