SIlverlight Универсальный шаблон Animat Родительский элемент управления Свойство - PullRequest
1 голос
/ 02 ноября 2010

У меня есть пользовательский элемент управления с его шаблоном, определенным в 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();

Так что я все еще надеюсь, что подобное решение разметки может быть сделано. Боже, я уверен, что должно быть что-то очевидное, что я здесь скучаю.

...