0

したがって、routedeventを持つcontentcontrolがあります。

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を使用するとアニメーションは機能しますが(コントロールのプロパティが初めて変更された場合のみ)、イベントに登録しようとしても何も起こりません。

これは可能ですか、私はそれについて完全に間違っていますか?これが理にかなっていることを願っています。

ありがとう

4

1 に答える 1

1

イベントを使用する代わりに、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();
    }
}
于 2011-03-25T17:09:17.807 に答える