3

我们正在编写一个基于 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每个文件中只有一个可以引用的定义会更好。

我整个上午都在寻找正确的语法,但一直没有运气。

如何VisualStateManager在我们所有的 XAML 文件之间共享它?

4

1 回答 1

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 中似乎无法重用 aStoryboardVisualState可能。VisualStateManager您仍然应该能够通过将行为封装在应用于自定义控件的样式中来实现您想要做的事情。这将为您提供您正在寻找的单点故障。

于 2010-12-06T15:34:25.003 回答