[英]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值為2
則WebpageContainer
向上移動120。
我想以編程方式在文件后面的代碼中將Storyboard的DoubleAnimation
的值更改To
,但是要做到這一點,我需要獲得Storyboard(我認為)。
根據MSDN文檔 ,直接訪問應該有效,但是如果我嘗試分配值:
Storyboard maximizeSizeStory = MaximizeSizeStory;
然后maximizeSizeStory為null
,然后在“ 監視”窗口中查看, MaximizeSizeStory
也為空。
為DoubleAnimation
分配一個名稱並嘗試直接訪問它:
<DoubleAnimation x:Name="MaximizeAnimation" ../>
當在ViewModel中更改DataTrigger綁定時,這將導致應用程序崩潰,並出現null ref異常。
哦,是的,后面代碼中的null
也為null
。
像在此問題中一樣使用它的UID
查找元素:您不能,因為UIElement和DependencyObject不再定義UID。
故事板不是UIElement,我認為這是使用FindName
的原因
Storyboard sb = this.FindName("MaximizeSizeStory") as Storyboard;
還返回null。
通過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.