У меня есть 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'.
Как я могу это исправить?