2016-11-24 72 views

回答

0

如果我不錯過任何東西,你的意思是移動視圖',只需在ViewModel中添加一個新的bool var(類似isLandscape)來控制將使用哪個DataTemplate。你可以用觸發器或其他方式來控制它。

我想你需要這個問題的更多標籤。

0

通用Windows平臺有一個AdaptiveTrigger,它允許您指定在給定的VisualState將在哪些條件下設置。使用樣式設置器,您可以更改頁面的佈局以適應您的需求。

WPF沒有此功能,但您可以使用VisualStateManagerStoryboardsSizeChanged事件使用VisualStateManager

到你的窗口內容的根元素,你可以添加一個VisualStateManager兩組:

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="ApplicationViewStates"> 
     <VisualState x:Name="Landscape"/> 
     <VisualState x:Name="Portrait"> 
      <Storyboard> 
       <ObjectAnimationUsingKeyFrames 
        Storyboard.TargetProperty="SomeProperty" 
        Storyboard.TargetName="SomeElement"> 
        <DiscreteObjectKeyFrame KeyTime="0" Value="SomeValue"/> 
       </ObjectAnimationUsingKeyFrames> 
       ... 
      </Storyboard> 
     </VisualState> 

現在在後臺代碼,你可以線了WindowSizeChanged事件:

this.SizeChanged += (s,e) => 
{ 
    //some condition you want to use to distinguish landscape and portrait 
    if (Width < Height) 
    { 
     VisualStateManager.GoToState(this, "Portrait", false); 
    } 
    else 
    { 
     VisualStateManager.GoToState(this, "Landscape", false); 
    } 
} 

或者,您可以使用代碼完成所有操作,也可以使用SizeChanged事件,但在此情況下,如果您有多個狀態,則需要首先將每個屬性重置爲默認值:

this.SizeChanged += (s,e) => 
{ 
    //reset all changed properties to default value here 
    ... 
    //some condition you want to use to distinguish landscape and portrait 
    if (Width < Height) 
    { 
     //set properties for portrait 
    } 
} 
+0

那麼我會將及其所有孩子複製到節點? – rukiman

+0

佈局看起來與此類似 - http://dotneteers.net/blogs/vbandi/archive/2009/12/29/no-more-magic-strings-with-visualstatemanager-gotostate.aspx。您只需將VisualStateManager元素添加到視圖的根目錄 - 通常是主網格。 –

相關問題