我们正在编写一个基于Prism的Silverlight应用程序,我们在不同的模块中有一大堆页面。
页面之间的转换是通过导航事件处理的,每个模块都实现了以下方法,以便在导航时显示页面并在导航时隐藏页面:
public void Show()
{
VisualStateManager.GoToState(this, "ShowState", true);
}
public void Hide()
{
VisualStateManager.GoToState(this, "HideState", true);
}
目前,每个模块的XAML文件中都定义了“ShowState”和“HideState”,因此复制的次数太多了。
<Grid x:Name="LayoutRoot">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="VisualStates">
<VisualState x:Name="ShowState">
...
</VisualState>
<VisualState x:Name="HideState">
...
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
其中...
表示每次转换的Storyboard
。
我刚刚发现Storyboard
定义中的错误,目前我将不得不在所有文件中复制修复程序。如果只有一个Storyboard
的定义可以在每个文件中引用,那就更好了。
我整个上午都搜索了正确的语法,但却没有运气。
如何在所有XAML文件之间共享此VisualStateManager
?
答案 0 :(得分:2)
<Storyboard x:Key="ShowStoryboard">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="glow" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<VisualState x:Name="ShowState">
<BeginStoryboard Storyboard="{StaticResource ShowStoryboard}"/>
</VisualState>
如上所示,可以在XAML中引用您的故事板。最重要的部分是将Storyboard存储为某个地方的资源。之后,您应该能够在VisualState中使用BeginStoryboard引用。
编辑:以上内容在WPF中可能出现,但在SL中无法实现。截至目前,在SL中可能无法重用Storyboard
或VisualState
。通过将VisualStateManager
行为封装在应用于自定义控件的样式中,您仍应该能够实现您要执行的操作。这将为您提供您正在寻找的单点故障。