使用 Xaml 故事板尝试淡入一个元素并同时淡出另一个元素时出错
Getting error when trying to fade-in one element and fade-out another at the same time using Xaml Storyboards
我希望最终确定我的应用程序的外观,但很难将过渡动画应用于非常基本的问题。
您可以在附件中找到我正在努力处理的代码。我已经注释掉了我在开发和原型制作过程中使用的 setter。他们的工作正如我所期望的那样。
情节提要转换在任何形状或形式上都不起作用。仅添加一个故事板转换与所有或任何设置器 "works" 相结合,因为我没有收到任何运行时错误,但转换根本没有出现。
我想知道我是否没有完全误解故事板的工作原理。
我得到的错误是:
Multiple animations in the same containing Storyboard cannot target the same property on a single element.
这是简化代码:
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:1"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="StateA">
<!--<VisualState.Setters>
<Setter Target="FirstElement.Visibility" Value="Visible" />
<Setter Target="SecondElement.Visibility" Value="Collapsed" />
</VisualState.Setters>-->
<Storyboard>
<PopOutThemeAnimation TargetName="SecondElement"/>
<PopInThemeAnimation TargetName="FirstElement"/>
</Storyboard>
</VisualState>
<VisualState x:Name="StateB">
<!-- <VisualState.Setters>
<Setter Target="FirstElement.Visibility" Value="Collapsed" />
<Setter Target="SecondElement.Visibility" Value="Visible" />
</VisualState.Setters>-->
<Storyboard>
<PopOutThemeAnimation TargetName="FirstElement"/>
<PopInThemeAnimation TargetName="SecondElement"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle Name="FirstElement"
Fill="Blue"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Width="200"
Height="200"
DoubleTapped="GoToStateB" />
<Rectangle Name="SecondElement"
Fill="Red"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Width="200"
Height="200"
DoubleTapped="GoToStateA" />
</Grid>
后面加上下面简单的代码:
private void GoToStateA(object sender, DoubleTappedRoutedEventArgs e)
{
// do something
VisualStateManager.GoToState(this, "StateA", true);
}
private void GoToStateB(object sender, DoubleTappedRoutedEventArgs e)
{
// do something else
VisualStateManager.GoToState(this, "StateB", true);
}
编辑:JustinXL指出的"solution"是下面的Xaml元素需要删除,运行时错误消失:
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:1"/>
</VisualStateGroup.Transitions>
我不太清楚为什么会这样(真正的错误或仅仅是一个晦涩的设计陷阱)。
事实证明,故事板必须在 VisualTransition 中,而不是在 VisualState 本身中,尽管您可以在视觉状态下制作动画故事板。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisualStateGroup">
<VisualStateGroup.Transitions>
<VisualTransition To="StateA">
<VisualTransition.Storyboard>
<Storyboard>
<PopOutThemeAnimation TargetName="SecondElement"/>
<PopInThemeAnimation TargetName="FirstElement"/>
</Storyboard>
</VisualTransition.Storyboard>
</VisualTransition>
<VisualTransition To="StateB">
<VisualTransition.Storyboard>
<Storyboard>
<PopOutThemeAnimation TargetName="FirstElement"/>
<PopInThemeAnimation TargetName="SecondElement"/>
</Storyboard>
</VisualTransition.Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="StateA">
<VisualState.Setters>
<Setter Target="FirstElement.Visibility" Value="Visible" />
<Setter Target="SecondElement.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="StateB">
<VisualState.Setters>
<Setter Target="FirstElement.Visibility" Value="Collapsed" />
<Setter Target="SecondElement.Visibility" Value="Visible" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
其实更简单的解决办法是完全删除VisualStateGroup
中的Transitions
。
另请注意,我添加了 IsHitTestVisible
更改,因此 FirstElement
将能够接收点击。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="StateA">
<VisualState.Setters>
<Setter Target="SecondElement.(UIElement.IsHitTestVisible)"
Value="False" />
</VisualState.Setters>
<Storyboard>
<PopOutThemeAnimation TargetName="SecondElement" />
<PopInThemeAnimation TargetName="FirstElement" />
</Storyboard>
</VisualState>
<VisualState x:Name="StateB">
<Storyboard>
<PopOutThemeAnimation TargetName="FirstElement" />
<PopInThemeAnimation TargetName="SecondElement" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
我希望最终确定我的应用程序的外观,但很难将过渡动画应用于非常基本的问题。
您可以在附件中找到我正在努力处理的代码。我已经注释掉了我在开发和原型制作过程中使用的 setter。他们的工作正如我所期望的那样。
情节提要转换在任何形状或形式上都不起作用。仅添加一个故事板转换与所有或任何设置器 "works" 相结合,因为我没有收到任何运行时错误,但转换根本没有出现。
我想知道我是否没有完全误解故事板的工作原理。
我得到的错误是:
Multiple animations in the same containing Storyboard cannot target the same property on a single element.
这是简化代码:
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:1"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="StateA">
<!--<VisualState.Setters>
<Setter Target="FirstElement.Visibility" Value="Visible" />
<Setter Target="SecondElement.Visibility" Value="Collapsed" />
</VisualState.Setters>-->
<Storyboard>
<PopOutThemeAnimation TargetName="SecondElement"/>
<PopInThemeAnimation TargetName="FirstElement"/>
</Storyboard>
</VisualState>
<VisualState x:Name="StateB">
<!-- <VisualState.Setters>
<Setter Target="FirstElement.Visibility" Value="Collapsed" />
<Setter Target="SecondElement.Visibility" Value="Visible" />
</VisualState.Setters>-->
<Storyboard>
<PopOutThemeAnimation TargetName="FirstElement"/>
<PopInThemeAnimation TargetName="SecondElement"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Rectangle Name="FirstElement"
Fill="Blue"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Width="200"
Height="200"
DoubleTapped="GoToStateB" />
<Rectangle Name="SecondElement"
Fill="Red"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Width="200"
Height="200"
DoubleTapped="GoToStateA" />
</Grid>
后面加上下面简单的代码:
private void GoToStateA(object sender, DoubleTappedRoutedEventArgs e)
{
// do something
VisualStateManager.GoToState(this, "StateA", true);
}
private void GoToStateB(object sender, DoubleTappedRoutedEventArgs e)
{
// do something else
VisualStateManager.GoToState(this, "StateB", true);
}
编辑:JustinXL指出的"solution"是下面的Xaml元素需要删除,运行时错误消失:
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:1"/>
</VisualStateGroup.Transitions>
我不太清楚为什么会这样(真正的错误或仅仅是一个晦涩的设计陷阱)。
事实证明,故事板必须在 VisualTransition 中,而不是在 VisualState 本身中,尽管您可以在视觉状态下制作动画故事板。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisualStateGroup">
<VisualStateGroup.Transitions>
<VisualTransition To="StateA">
<VisualTransition.Storyboard>
<Storyboard>
<PopOutThemeAnimation TargetName="SecondElement"/>
<PopInThemeAnimation TargetName="FirstElement"/>
</Storyboard>
</VisualTransition.Storyboard>
</VisualTransition>
<VisualTransition To="StateB">
<VisualTransition.Storyboard>
<Storyboard>
<PopOutThemeAnimation TargetName="FirstElement"/>
<PopInThemeAnimation TargetName="SecondElement"/>
</Storyboard>
</VisualTransition.Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="StateA">
<VisualState.Setters>
<Setter Target="FirstElement.Visibility" Value="Visible" />
<Setter Target="SecondElement.Visibility" Value="Collapsed" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="StateB">
<VisualState.Setters>
<Setter Target="FirstElement.Visibility" Value="Collapsed" />
<Setter Target="SecondElement.Visibility" Value="Visible" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
其实更简单的解决办法是完全删除VisualStateGroup
中的Transitions
。
另请注意,我添加了 IsHitTestVisible
更改,因此 FirstElement
将能够接收点击。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup>
<VisualState x:Name="StateA">
<VisualState.Setters>
<Setter Target="SecondElement.(UIElement.IsHitTestVisible)"
Value="False" />
</VisualState.Setters>
<Storyboard>
<PopOutThemeAnimation TargetName="SecondElement" />
<PopInThemeAnimation TargetName="FirstElement" />
</Storyboard>
</VisualState>
<VisualState x:Name="StateB">
<Storyboard>
<PopOutThemeAnimation TargetName="FirstElement" />
<PopInThemeAnimation TargetName="SecondElement" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>