Поведение Blend Interaction дает ошибку «указывает на неизменный экземпляр» - PullRequest
2 голосов
/ 14 июня 2010

У меня есть 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:

Значение свойства 'Children' в пути '(0). (1) [0]. (2)' указывает на неизменный экземпляр 'System.Windows.Media.TransformCollection'.

Как я могу это исправить?

1 Ответ

4 голосов
/ 15 июня 2010

Проблема в том, что TranslateZoomRotateBehavior заменяет ваш ScaleTransform на MatrixTransform, в результате чего первые две анимации в вашей раскадровке нацеливаются на свойство, которого больше не существует.

Поскольку вы не можете анимировать значения матрицы для получения эффекта затухания, я бы использовал дополнительный контейнерный элемент управления. Внешнее для поведения, а затем внутреннее, чтобы оно исчезло визуально.

...