Список файлов ресурсов WPF contentcontrol routedevent для события - PullRequest
0 голосов
/ 25 марта 2011

поэтому у меня есть contentcontrol, у которого есть routedevent:

public class TestBlind : ContentControl
{
public static readonly RoutedEvent VisibilityVisibleEvent =
        EventManager.RegisterRoutedEvent("VisibilityVisible", RoutingStrategy.Tunnel, typeof(Visibility), typeof(TestBlind));

    public event RoutedEventHandler VisibilityVisible
    {
        add { AddHandler(VisibilityVisibleEvent, value); }
        remove { RemoveHandler(VisibilityVisibleEvent, value); }
    }

    [Category("TestBlind")]
    public bool IsContentVisible
    {
        get { return (bool)GetValue(IsContentVisibleProperty); }
        set { SetValue(IsContentVisibleProperty, value); }
    }

    public static readonly DependencyProperty IsContentVisibleProperty = DependencyProperty.Register("IsContentVisible", typeof(bool), typeof(TestBlind),
        new FrameworkPropertyMetadata(new PropertyChangedCallback(OnIsOverlayContentVisibleChanged)));


    private static void OnIsOverlayContentVisibleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TestBlind blind = d as TestBlind;
        if (blind != null)
            SetVisibility(blind);
    }

    private static void SetVisibility(TestBlind blind)
    { 
        blind.Visibility = blind.IsContentVisible ? Visibility.Visible : Visibility.Hidden;
        blind.RaiseEvent(blind.Visibility == Visibility.Visible ? new RoutedEventArgs(VisibilityVisibleEvent) : new RoutedEventArgs(VisibilityHiddenEvent));            
    }
}

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

В моем файле ресурсов для элемента управления у меня есть следующее действие, которое (я думал) вызовет увидеть событие и запустить анимацию:

<Grid.Triggers>
                        <EventTrigger RoutedEvent="control:TestBlind.VisibilityVisible">
<!--                            <EventTrigger RoutedEvent="ContentControl.Loaded">-->
                            <EventTrigger.Actions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames Duration="00:00:02.25" BeginTime="00:00:00" Storyboard.TargetName="backdDropGlow" Storyboard.TargetProperty="Opacity">
                                            <SplineDoubleKeyFrame KeyTime="00:00:00.00" Value="0"/>
                                            <SplineDoubleKeyFrame KeyTime="00:00:02.25" Value="1"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger.Actions>
                        </EventTrigger>

Анимация будет работать, если я использую ContentControl.Loaded (только при первом изменении свойства элемента управления), но если я попытаюсь зарегистрировать его для своего события, ничего не произойдет.

Возможно ли это, я совершенно ошибаюсь? Я надеюсь, что это имело смысл.

Спасибо

1 Ответ

1 голос
/ 25 марта 2011

Почему бы не запустить анимацию при изменении свойства DependnecyProperty вместо использования события?

Я делал это в прошлом, прикрепляя событие к DependencyPropertyDescriptor в конструкторе

public TestBlind()
{
    DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(TestBlind.VisibilityVisible, typeof(TestBlind));
    if (dpd != null) dpd.AddValueChanged(this, delegate { IsVisibilityVisibleChanged(); });
}

private void IsVisibilityVisibleChanged()
{
    bool isShown = GetVisibilityVisible(this);
    if (isShown)
    {
        Storyboard animation = (Storyboard)this.FindResource("MyStoryboard");
        animation.Begin();
    }
}
...