2

「モーダルビュー」に表示される、他のユーザーコントロールの基本クラスであるUserControlがあります。
表示されたときにすべてのユーザーコントロールをフェードインさせ、閉じたときにフェードアウトさせたい。また、ユーザーがコントロールを移動できるようにしたいと思います。私のコンストラクターは次のようになります。

var tg = new TransformGroup();
tg.Children.Add(new ScaleTransform());
RenderTransform = tg;
var behaviors = Interaction.GetBehaviors(this);
behaviors.Add(new TranslateZoomRotateBehavior());  

Loaded += ModalDialogBase_Loaded;

また、ModalDialogBase_Loadedメソッドは次のようになります。

private void ModalDialogBase_Loaded(object sender, RoutedEventArgs e)
{
    var fadeInStoryboard = (Storyboard)TryFindResource("modalDialogFadeIn");
    fadeInStoryboard.Begin(this);
}

コントロールの閉じるボタンを押すと、このメソッドが呼び出されます。

protected virtual void Close()
{
    var fadeOutStoryboard = (Storyboard)TryFindResource("modalDialogFadeOut");  
    fadeOutStoryboard = fadeOutStoryboard.Clone();
    fadeOutStoryboard.Completed += delegate
    {
        RaiseEvent(new RoutedEventArgs(ClosedEvent));
    };
    fadeOutStoryboard.Begin(this);
}

フェードアウトのストーリーボードは次のようになります。

<Storyboard x:Key="modalDialogFadeOut">
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="{x:Null}">
        <EasingDoubleKeyFrame KeyTime="0" Value="1">
            <EasingDoubleKeyFrame.EasingFunction>
                <BackEase EasingMode="EaseIn" Amplitude="0.3" />
            </EasingDoubleKeyFrame.EasingFunction>
        </EasingDoubleKeyFrame>
        <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0">
            <EasingDoubleKeyFrame.EasingFunction>
                <BackEase EasingMode="EaseIn" Amplitude="0.3" />
            </EasingDoubleKeyFrame.EasingFunction>
        </EasingDoubleKeyFrame>
    </DoubleAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="{x:Null}">
        <EasingDoubleKeyFrame KeyTime="0" Value="1">
            <EasingDoubleKeyFrame.EasingFunction>
                <BackEase EasingMode="EaseIn" Amplitude="0.3" />
            </EasingDoubleKeyFrame.EasingFunction>
        </EasingDoubleKeyFrame>
        <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0">
            <EasingDoubleKeyFrame.EasingFunction>
                <BackEase EasingMode="EaseIn" Amplitude="0.3" />
            </EasingDoubleKeyFrame.EasingFunction>
        </EasingDoubleKeyFrame>
    </DoubleAnimationUsingKeyFrames>
    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="{x:Null}">
        <EasingDoubleKeyFrame KeyTime="0" Value="1" />
        <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0" />
        <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="0" />
    </DoubleAnimationUsingKeyFrames>
</Storyboard>

ユーザーコントロールが表示されていて、ユーザーが画面上でそれを動かさない場合、すべてが正常に機能します。ただし、ユーザーがコントロールを移動すると、modalDialogFadeOutストーリーボードの起動時に次のエラーが発生します。

パス'(0)。(1)[0]。(2)'の'Children'プロパティ値は、'System.Windows.Media.TransformCollection'の不変インスタンスを指します。

どうすればこれを修正できますか?

4

1 に答える 1

4

問題は、TranslateZoomRotateBehaviorがScaleTransformをMatrixTransformに置き換えているため、ストーリーボードの最初の2つのアニメーションが存在しないプロパティをターゲットにしていることです。

フェードアウト効果を得るためにマトリックスの値をアニメートすることはできないので、追加のコンテナーコントロールを使用します。動作の最も外側、次に視覚的にフェードアウトする内側の動作。

于 2010-06-15T07:06:27.357 に答える