基于ApplicationViewState动态更改样式

时间:2012-09-10 21:01:38

标签: c# .net xaml windows-8 microsoft-metro

我在Metro应用的全屏视图中有一个StackPanel包含三个红色Grid元素。

在:
Fullscreen

当应用程序更改为捕捉状态时,动态修改所有子Style的{​​{1}}的正确方法是什么,以便将Grid设置为蓝色Background 1}}到N像素?

在:
Snapped

1 个答案:

答案 0 :(得分:2)

在WinRT XAML中,虽然您可以在运行时更改样式,但更改不会传播到具有该样式的现有元素。您可以更改分配给元素的样式,但不能更改样式。因此,您可以清除/重置样式,它将更改元素,但您无法更改样式并让它自动调整。

如果不是太多网格,最简单的方法是从LayoutAwarePage(VS / Blend Metro模板的一部分)开始,在分配给ApplicationViewStates的VisualStates中,只需根据需要调整每个网格。您可以应用新的样式或大小,或任何您想要的东西。这很简单。

或者,您也可以创建一个定义了各种状态的资源,并在网格所在的页面中,您应该能够将Loaded事件连接到基类(LayoutAwarePage)中的公共StartLayoutUpdates方法:

通过这种方式,你可以获得这样的状态。但是,这些需要在网格上定义 - 这可能是混乱的(并且不切实际)。你最好切换到包含网格实例的当前模板化控件(或UserControl)并在那里应用状态。

<VisualStateGroup x:Name="ApplicationViewStates">
    <VisualState x:Name="FullScreenLandscape"/>
    <VisualState x:Name="Filled"/>
    <VisualState x:Name="FullScreenPortrait" />
    <!-- etc ...->
</VisualStateGroup>

或者,您可以手动创建一个Control并连接Window Resizing / Layout事件并执行相同的工作。它基本上是相同的(只取决于你想把逻辑放在哪里)。