我在Metro应用的全屏视图中有一个StackPanel
包含三个红色Grid
元素。
在:
当应用程序更改为捕捉状态时,动态修改所有子Style
的{{1}}的正确方法是什么,以便将Grid
设置为蓝色Background
1}}到N像素?
在:
答案 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事件并执行相同的工作。它基本上是相同的(只取决于你想把逻辑放在哪里)。