2012-09-10 202 views
0

我有一個StackPanel,其中包含Metro應用程序全屏視圖中的三個紅色Grid元素。基於ApplicationViewState動態更改樣式

前:
Fullscreen

什麼是動態修改所有孩子的Style有道Grid■當應用程序更改搶購狀態,使得它們Background被設置爲藍色和他們Height到N個像素?

後:
Snapped

回答

2

在WinRT的XAML,而你可以在運行時更改樣式,更改將不會傳播到與現有的風格元素。您可以更改分配給元素的樣式,但不能更改樣式。所以,你可以清除/重置樣式,它會改變元素,但是你不能改變樣式,並且不幸的是會自動調整樣式。

如果它沒有太多的網格最簡單的將是啓動一個LayoutAwarePage(在VS /一部分混合新城模板),並在分配給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事件並執行相同的工作。它基本上是一樣的(只要取決於你想放置邏輯的位置)。