Как динамически анимировать свойство в Silverlight 4 UserControl? - PullRequest
0 голосов
/ 17 ноября 2010

Я столкнулся с удивительным ограничением в пользовательском элементе управления Silverlight 4.

Я пытаюсь добиться панели, которая выдвигается из свернутого состояния при нажатии кнопки, нострока заголовка должна быть перетаскиваемой, чтобы можно было изменять размер этого развернутого состояния.

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

Попытка связать переменную из выделенного кода с параметром «Кому» в DoubleAnimation 'didn'не работает, просто молча игнорируется.

Поскольку я создаю UserControls для представления Views, элементы со свойствами x: Name не генерируются автоматически.

Я пытался обойти этоиспользуя приведенный ниже код, который имитирует то, что происходит в автоматически сгенерированном коде (с дополнительным бонусом за выполнение только после фактической загрузки макета):

public DoubleAnimation PanelOpenMaxHeightDoubleAnimation;

private void LayoutRoot_Loaded(object sender, System.Windows.RoutedEventArgs e)

{

    var LayoutRootreference = sender as Grid;

    PanelOpenMaxHeightDoubleAnimation = ((DoubleAnimation)(LayoutRootreference.FindName("PanelOpenMaxHeightDoubleAnimation")));

    PanelOpenMaxHeightDoubleAnimation.To = 383;

}

Это, однако, ломается при попытке установить значение To, так как FindName возвращает значение null (у меня есть x: Name, вручную установленное в XAML для этой конкретной анимации как «PanelOpenMaxHeightDoubleAnimation»).У меня есть скрывающееся подозрение, что FindName не может забрать DoubleAnimations из VisualStates, только фактические дочерние элементы макета?

Я нашел документацию по именным областям XAML на http://msdn.microsoft.com/en-us/library/cc189026(v=VS.95).aspx#UserControls,, но не совсем понял, какие у меня параметрывзяты из этого параграфа (кроме очень ограниченного):

Для случая UserControl не существует эквивалентного соглашения атрибута части шаблона для частей UserControl в определении XAML, а также нетШаблон применяется на всех.Тем не менее, области имен между определением и использованием остаются несвязанными, поскольку область имен определения определяется и затем эффективно запечатывается, когда вы упаковываете свой UserControl в сборку для повторного использования.В этом случае рекомендуется определять свой UserControl таким образом, чтобы любое значение, которое необходимо установить для изменения определения XAML, также предоставлялось как открытое свойство UserControl.

Что означает последнеепредложение?

Хотите знать, что я могу делать дальше?Должен ли я попытаться сгенерировать все состояние из кода?

1 Ответ

0 голосов
/ 18 ноября 2010

Ну, мне удалось это решить, так что я делюсь решением.

Вместо того, чтобы пытаться получить ссылку на DoubleAnimation in Resources, я назвал Grid в макете, который я хочу анимировать, и получил ссылку на него, используя код в исходном вопросе:

var SlidePanel = ((Grid)(LayoutRootreference.FindName("SlidePanel")));

Это возвращает элемент, и с его помощью можно создать DoubleAnimation и Storyboard с нуля исключительно в коде. Я просто использовал этот пример кода в качестве отправной точки: http://msdn.microsoft.com/en-us/library/cc189069(VS.95).aspx#procedural_code

Самое приятное то, что вы можете изменить параметр DoubleAnimation.To даже после настройки всего в раскадровке, так что теперь я просто сбрасываю это значение на мое вычисленное значение каждый раз перед вызовом Storyboard.Begin ().

Немного неудобно настраивать все это вручную, но, по крайней мере, оно хорошо работает, как только вы это сделаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...