Переключение между статической шириной и автоматической шириной с визуальными состояниями
У меня небольшая проблема с моим текущим приложением, связанная с визуальными состояниями и автоматической / статической шириной.
В зависимости от визуального состояния, StackPanel
либо имеет ширину = "Авто" или ширину ="400". Blend говорит мне, что я не могу анимировать между этими двумя значениями (и я здесь не анимирую, а просто переключаюсь между полноэкранным видео и комбинированным просмотром). Теперь я должен сделать явный тест и изменить ширину, когда я изменяю свое визуальное состояние (через VisualStateManager
-фреймворк. Есть ли способ сделать это в XAML (через раскадровки), а не в коде?
Некоторые примеры кода того, что я делаю сегодня:
private void Trailer_OnFullScreenToggled(object sender, EventArgs e)
{
var state = (Trailer.IsFullScreen() ? "Windowed" : "Fullscreen");
// HACK: Done to get past the auto / px issue
VisualsGrid.Width = Trailer.IsFullScreen() ? 400.0 : Double.NaN;
VisualStateManager.GoToState(this, state, true);
}
Любая помощь будет принята с благодарностью!
1 ответ
Значение Auto для ширины имеет псевдоним Double.NaN. Вот почему анимация терпит неудачу - она не может выполнить интерполяцию с этим значением или из него.
Вы пытались использовать анимацию ключевого кадра с дискретным ключевым кадром? Использование дискретной анимации ключевых кадров должно обойти проблему, заключающуюся в том, что система анимации не может интерполировать данные в Double.NaN или из Double.NaN, поскольку интерполяция не произойдет.
В данный момент я не нахожусь перед средой разработки, поэтому я не уверен, нужно ли вам использовать DoubleAnimationUsingKeyFrames с DiscreteDoubleKeyFrame и значением Double.NaN или StringAnimationUsingKeyFrames с DiscreteStringKeyFrame и значением Auto.
Это, конечно, не будет делать плавную анимацию от фиксированной ширины до автоматического изменения размера, но вместо этого будет появляться между двумя.