У меня есть пользовательский элемент управления с его шаблоном, определенным в generic.xaml. Это двухрядная сетка, в которой второй ряд может быть «втянут» в первый ряд.
Однако я обнаружил, что когда я просто анимировал высоту второй строки или сетки для достижения желаемых результатов, родительский элемент шаблона (т. Е. Экземпляр моего пользовательского элемента управления) все еще имел ту же высоту. Это приводит к появлению списков с большим количеством пробелов между каждым элементом.
Мне нужно, чтобы анимация изменила высоту фактического содержащего элемента управления, но я не знаю, как это сделать. Я могу установить высоту легко с чем-то вроде:
<Style TargetType="myLib:MyControl">
<!--Default Values-->
<Setter Property="Height" Value="100" />
Однако при определении анимации я понятия не имею, что поместить в StoryBoard.TargetName для ссылки на элемент управления «this»:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ViewStates">
<VisualState x:Name="Retracted">
<DoubleAnimation Storyboard.TargetName="this?" Storyboard.TargetProperty="Height" To="25" Duration="0" />
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
Если я оставлю это поле пустым, я получу ошибку.
Полагаю, я могу создать анимацию в коде для элемента управления, но вместо этого я бы хотел использовать менеджер состояний.
Я также думал о создании свойства собственной зависимости, которое кажется немного странным.
Нет ли здесь какой-нибудь привязки, которую я мог бы использовать?
Заранее спасибо за любую помощь:)
PS - позже я смог получить желаемый эффект в коде:
Storyboard sb = new Storyboard();
DoubleAnimation da = new DoubleAnimation();
da.To = ExtendedHeight;
da.Duration = new Duration(TimeSpan.FromMilliseconds(200));
sb.Children.Add(da);
Storyboard.SetTarget(da, this);
Storyboard.SetTargetProperty(da, new PropertyPath("Height"));
sb.Begin();
Так что я все еще надеюсь, что подобное решение разметки может быть сделано. Боже, я уверен, что должно быть что-то очевидное, что я здесь скучаю.