如何检测方向变化和更改布局?

Lui*_*cia 8 xaml microsoft-metro windows-8 windows-runtime

让我们说我有一个网格,每个单元格内有2行,2列和许多控件.

当应用程序更改为快照模式时,我的意思是屏幕的1/3,我希望应用程序只有一个列,2行,并且只显示我将决定的一些控件.

我对此有什么样的控制?

谢谢

Sev*_*ate 9

考虑到此事件的备注部分,使用DisplayProperties.OrientationChanged事件(由@Jan K.建议)可能不是您正在寻找的内容:

DisplayProperties.OrientationChanged事件只发生时的显示器或监视器的变化方向,不一定当你的应用程序的变化方向.要确定应用程序的方向以进行布局,请使用ApplicationView.Value属性.

但是因为在Windows 8.1发布之后,ApplicationView.Value可能会被放弃MS建议使用ApplicationView.GetForCurrentView()代替:

在Windows 8.1 Preview之后,ApplicationView静态方法可能会被更改或不可用于发布.而是使用ApplicationView.GetForCurrentView()来获取ApplicationView的实例.

所以现在我最终得到了这个代码(有一种动态视图,不幸的是不能通过VisualStateManager预先设计XAML中的所有内容):

public MainPage()
{
    InitializeComponent();
    Window.Current.SizeChanged += (sender, args) =>
    {
        ApplicationView currentView = ApplicationView.GetForCurrentView();

        if (currentView.Orientation == ApplicationViewOrientation.Landscape)
        {
            // when args.Size.Width > args.Size.Height
        }
        else if (currentView.Orientation == ApplicationViewOrientation.Portrait)
        {
            // when args.Size.Width < args.Size.Height
        }
    };
}
Run Code Online (Sandbox Code Playgroud)


Jan*_* K. 8

看看DisplayProperties.OrientationChanged-Event.当它触发时,您可以修改网格并重新排列控件.


Kol*_*lky 8

您应该在xaml中使用VisualStateManager,以获得完整的xaml解决方案:

<Grid x:Name="LayoutRoot">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="OrientationStates">
            <VisualState x:Name="Full"/>
            <VisualState x:Name="Fill"/>
            <VisualState x:Name="Portrait"/>
            <VisualState x:Name="Snapped"/>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
</Grid>
Run Code Online (Sandbox Code Playgroud)

为每个VisualState创建StoryBoards并隐藏/显示xaml中的元素.Microsoft示例使用相同的解决方案.

-

更新

我在网上搜索并找到了正确的状态,这个链接背后有一个例子:MSDN.

 <VisualStateManager.VisualStateGroups>
     <VisualStateGroup x:Name="ApplicationViewStates">
        <VisualState x:Name="FullScreenLandscape"/>
        <VisualState x:Name="Filled"/>
        <VisualState x:Name="FullScreenPortrait"/>
        <VisualState x:Name="Snapped"/>
    </VisualStateGroup>
 </VisualStateManager.VisualStateGroups>
Run Code Online (Sandbox Code Playgroud)

状态反映了ApplicationViewState枚举.可以在这里找到更多信息.