2014-01-02 4 views
0

Я работаю над настраиваемой сеткой, подобной панели, где можно увеличить один элемент. Во-первых, все элементы имеют одинаковый размер. Если нужно увеличить масштаб, он получает в два раза больше предыдущего размера, а остальные элементы равномерно заполняют оставшееся пространство (поэтому все элементы, кроме тех, которые находятся в одной строке или столбце с увеличенным элементом, получают меньшую высоту и ширину, одна и та же строка получает меньшую ширину и увеличенную высоту и т. д.).WPF: Measure/Arrange вызывается только один раз во время анимации

Все работало нормально, пока я не добавил анимацию для увеличения.

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

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

Кто-нибудь знает, как решить одно из этих поведений?

С уважением Tobias

Edit: Код для анимации:

 Size normalSize = GetNormalElementSize(new Size(ActualWidth, ActualHeight)); 

     DoubleAnimation widthAnimation = new DoubleAnimation 
     { 
      From = normalSize.Width, 
      To = normalSize.Width * 2, 
      Duration = TimeSpan.FromMilliseconds(750), 
      EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseInOut } 
     }; 

     DoubleAnimation heightAnimation = new DoubleAnimation 
     { 
      From = normalSize.Height, 
      To = normalSize.Height * 2, 
      Duration = TimeSpan.FromMilliseconds(750), 
      EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseInOut } 
     }; 

     ZoomedElement.Height = normalSize.Height; 
     ZoomedElement.Width = normalSize.Width; 

     Storyboard.SetTargetProperty(widthAnimation, new PropertyPath(FrameworkElement.WidthProperty)); 
     Storyboard.SetTarget(widthAnimation, ZoomedElement); 
     Storyboard.SetTargetProperty(heightAnimation, new PropertyPath(FrameworkElement.HeightProperty)); 
     Storyboard.SetTarget(heightAnimation, ZoomedElement); 

     Storyboard zoomStoryboard = new Storyboard(); 
     zoomStoryboard.Children.Add(heightAnimation); 
     zoomStoryboard.Children.Add(widthAnimation); 
     zoomStoryboard.CurrentTimeInvalidated += zoomStoryboard_CurrentTimeInvalidated; 
     zoomStoryboard.Begin(); 
+1

введите код этой добавленной анимации, было бы полезно помочь вам. – Sankarann

+0

Я добавил код, который я использую выше – Tobi

ответ

0

Я думаю, вы используете RenderTransformation, попробуйте вместо LayoutTransformation.

+0

См. Мое редактирование выше. Я попробовал его с помощью набора ScaleTransform в качестве Layouttransform, и в итоге у меня были увеличенные элементы, требующие полного экрана в качестве размера (я предполагаю, что они имеют размер NaN до масштабирования), а не вдвое больше их фактического размера – Tobi