2012-09-05 45 views

回答

5

請參閱this關於如何捕捉視圖狀態更改的博文。基本上,建議歸結爲抓住調整大小事件,然後檢查視圖狀態是這樣的:

window.addEventListener("resize", onResize); 


function onResize() { 
    // Update view for the new window size 
    updateView(); 
} 

function updateView() { 
    // Query for the current view state 
    var myViewState = Windows.UI.ViewManagement.ApplicationView.value; 

    var viewStates = Windows.UI.ViewManagement.ApplicationViewState; 
    var statusText; 

    // Assign text according to view state 
    switch (myViewState) { 
     case viewStates.snapped: 
      statusText = "This app is snapped!"; 
      break; 
     case viewStates.filled: 
      statusText = "This app is in filled state!"; 
      break; 
     case viewStates.fullScreenLandscape: 
      statusText = "This app is full screen landscape!"; 
      break; 
     case viewStates.fullScreenPortrait: 
      statusText = "This app is full screen portrait!"; 
      break; 
     default: 
      statusText = "Error: Invalid view state returned."; 
      break; 
    } 

如果您在Microsoft Visual Studio Express的2012 RC期待的Windows 8 template for Javascript你會看到導航這樣的事情。 JS:

window.onresize = this._resized.bind(this); 

_resized: function(args) { 
    if (this.pageControl && this.pageControl.updateLayout) { 
     this.pageControl.updateLayout.call(this.pageControl, this.pageElement, appView.value, this.lastViewstate); 
    } 
    this.lastViewstate = appView.value; 
}, 

//*page*.js 

updateLayout: function (element, viewState, lastViewState) { 
    /// <param name="element" domElement="true" /> 
    var listView = element.querySelector(".itemslist").winControl; 
    if (lastViewState !== viewState) { 
      if (lastViewState === appViewState.snapped || viewState === appViewState.snapped) { 
       var handler = function (e) { 
       listView.removeEventListener("contentanimating", handler, false); 
       e.preventDefault(); 
      } 
      listView.addEventListener("contentanimating", handler, false); 
      var firstVisible = listView.indexOfFirstVisible; 
      this._initializeLayout(listView, viewState); 
      if (firstVisible >= 0 && listView.itemDataSource.list.length > 0) { 
       listView.indexOfFirstVisible = firstVisible; 
      } 
     } 
    } 
}, 

_initializeLayout: function (listView, viewState) { 

    if (viewState === appViewState.snapped) { 
     listView.layout = new ui.ListLayout(); 
    } else { 
     listView.layout = new ui.GridLayout(); 
    } 
}, 

根據this MSDN頁面,您還可以使用媒體查詢時,視圖狀態的變化會影響在CSS中指定的CSS屬性或佈局。對於所有其他更改,應使用onResize。

+0

另一種選擇是使用媒體選擇器: var f = matchMedia(「all and(-ms-view-stated:snapped)」); f.addListener(myHandlerFn); –

+0

@DominicHopton你可以捕捉狀態變化,但是我鏈接的博客文章指出,當事件觸發時,大小不會改變,所以如果你有任何依賴於大小的UI,那麼你幾乎必須等待'onResize'事件。捕捉'onResize'總是有效的。 – mydogisbox

+0

這是消費者預覽推薦; RP&RTM不再是這種情況。 –