簡體   English   中英

如何在Windows 8.1(WinRT)中訪問情節提要

[英]How to access Storyboard in Windows 8.1 (WinRT)

在我的xaml文件中,我有:

<Grid x:Name="LayoutRoot"...>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="WebformSizeState">
<VisualState x:Name="MaximizedSizeState">
     <Storyboard x:Name="MaximizeSizeStory">
         <DoubleAnimation Duration="0:0:0.3" To="-120" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" Storyboard.TargetName="WebpageContainer"/>
     </Storyboard>
</VisualState>
...

<ec:DataTriggerBehavior Value="2" Binding="{Binding WebpageSizeState, Converter={StaticResource EnumToIntegerConverter}}">
     <ec:GoToStateAction StateName="MaximizedSizeState"/>
</ec:DataTriggerBehavior>
...

該代碼按原樣工作。 如果WebpageSizeState的in值為2WebpageContainer向上移動120。

我想以編程方式在文件后面的代碼中將Storyboard的DoubleAnimation的值更改To ,但是要做到這一點,我需要獲得Storyboard(我認為)。

我嘗試過但失敗的事情:

嘗試1

根據MSDN文檔 ,直接訪問應該有效,但是如果我嘗試分配值:

Storyboard maximizeSizeStory = MaximizeSizeStory;

然后maximizeSizeStory為null ,然后在“ 監視”窗口中查看, MaximizeSizeStory也為空。

嘗試2

DoubleAnimation分配一個名稱並嘗試直接訪問它:

<DoubleAnimation x:Name="MaximizeAnimation" ../>

當在ViewModel中更改DataTrigger綁定時,這將導致應用程序崩潰,並出現null ref異常。

哦,是的,后面代碼中的null也為null

嘗試3

像在此問題中一樣使用它的UID查找元素:您不能,因為UIElementDependencyObject不再定義UID。

故事板不是UIElement,我認為這是使用FindName的原因

Storyboard sb = this.FindName("MaximizeSizeStory") as Storyboard;

還返回null。

嘗試4

通過Key訪問它不起作用,因為它沒有在Page.Resources或字典中定義。

如果嘗試在Page.Resources聲明它, Page.Resources產生錯誤:

屬性元素不能是另一個屬性元素的直接內容。 不支持嵌套屬性:VisualStateManager.VisualStateGroups。


我很茫然,有什么想法嗎?

這是一種方法(為簡化起見,為簡化示例)。 注意,因為情節提要板位於其中,所以使用了VisualStateManager.GetVisualStateGroups

在此處輸入圖片說明

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="MyGroups">
                <VisualState x:Name="MyStates">
                    <Storyboard x:Name="MyAnimation">
                        <ColorAnimation Duration="0" To="Yellow" Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/>
                    </Storyboard>
                </VisualState>
             </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
    <Rectangle x:Name="rectangle" Height="50" Width="50" Fill="red"/>
<Button HorizontalAlignment="Center" VerticalAlignment="Bottom" Content="Click me"                Click="Button_Click" />    
</Grid>

以及按鈕處理程序的代碼,我們實際上在其中訪問情節提要:

    private void Button_Click(object sender, RoutedEventArgs e)
{
    var storyboard = VisualStateManager.GetVisualStateGroups(this.LayoutRoot)[0].States[0].Storyboard;
    storyboard.Begin();
}

添加一些擴展名可以使代碼更具可讀性,並且不易出錯:

public sealed partial class SomePage
{
    void SomeMethod()
    {
        var storyboard = VisualStateManager.GetVisualStateGroups(this.LayoutRoot).Get("MyGroups").States.Get("MyStates").Storyboard;
    }
}

public static class StateExtensions
{
    public static VisualStateGroup Get(this IList<VisualStateGroup> stateGroups, string name)
    {
        return stateGroups.Single(x => x.Name == name);
    }

    public static VisualState Get(this IList<VisualState> stateGroups, string name)
    {
        return stateGroups.Single(x => x.Name == name);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM