代码之家  ›  专栏  ›  技术社区  ›  Peter Perháč

Windows Phone 7应用程序-方向更改

  •  4
  • Peter Perháč  · 技术社区  · 14 年前

    你好,各位开发者! 我正在开发一个WindowsPhone7应用程序,我不知道我认为对于那些老练的应用程序来说,什么是一个简单的问题。 假设我有一个由两个元素组成的布局:一个列表框(填充了大量的项目)和一个文本块(为用户提供了一些基本的说明)。

    当设备处于纵向方向时,我希望它们彼此重叠,当设备方向更改为横向方向时,我希望它们彼此相邻。

    对于纵向,我使用的是网格布局管理器,因为它允许我这样定义行的高度…第0行 Height="2*" 第1行 Height="*"

    列表框位于第0行,文本块位于第1行。现在,真正有趣的是简单地改变 RowDefinition 走进 ColumnDefinition 并将列表框/文本块重新分配给网格的列,而不是设备切换到横向时的行。

    但这只是我的主意。我不知道如何把这件事做得优雅。也许有更好的方法?或者这是正确的方法,并且有一些方法是为这个目的而构建的?

    谢谢你的建议!

    3 回复  |  直到 13 年前
        1
  •  3
  •   AnthonyWJones    14 年前

    对于默认的纵向配置,这样做如何:

    <Grid>
       <Grid.RowDefinitions>
           <RowDefinition Height="2*" />
           <RowDefinition Height="*" />
       </Grid.RowDefintions>
       <Grid.ColumnDefinitions>
           <ColumnDefinition Width="2*" />
           <ColumnDefinition Width="*" />
       </Grid.ColumnDefinitions>
    
       <ListBox x:Name="ItemList" Grid.ColumnSpan="2" />
       <TextBlock x:Name="Instructions" Grid.Row="1" Grid.ColumnSpan="2">
          Content
       </TextBlock> 
    

    然后在你 OrientationChanged 事件使用:

    if ((e.Orientation & PageOrientation.Portrait) == PageOrientation.Portrait)
    {
         Grid.SetRow(ItemList, 0);
         Grid.SetRowSpan(ItemList, 1);
         Grid.SetColumn(ItemList, 0);
         Grid.SetColumnSpan(ItemList, 2);
    
         Grid.SetRow(Instructions, 1);
         Grid.SetRowSpan(Instructions, 1);
         Grid.SetColumn(Instructions, 0);
         Grid.SetColumnSpan(Instructions, 2);
    }
    else
    {
         Grid.SetRow(ItemList, 0);
         Grid.SetRowSpan(ItemList, 2);
         Grid.SetColumn(ItemList, 0);
         Grid.SetColumnSpan(ItemList, 1);
    
         Grid.SetRow(Instructions, 0);
         Grid.SetRowSpan(Instructions, 2);
         Grid.SetColumn(Instructions, 1);
         Grid.SetColumnSpan(Instructions, 1);
    }
    
        2
  •  2
  •   Sergey Aldoukhov    14 年前

    对于定向,可视化状态管理器工作得最好。

    1. 在Blend中,定义两个状态,将它们命名为“port”和“land”。
    2. 将“设备”控制面板置于混合工作区。
    3. 通过切换方向和相应地设计每个布局来记录布局。
    4. 在方向更改事件中,使用以下代码:

    private void PhoneApplicationPage_OrientationChanged
    (object sender, OrientationChangedEventArgs e)
    {
       VisualStateManager
        .GoToState(this, e.Orientation.ToString().Substring(0, 4), true);
    }
    
        3
  •  1
  •   Peter Perháč    14 年前

    我在msdn的博客中找到了一篇很好的文章,它以非常简单的方式处理这种布局转换,并解释了其他方法:

    http://blogs.msdn.com/b/ptorr/archive/2010/03/27/strategies-for-dealing-with-orientation-changes.aspx

    为什么我没早点遇到这个?:-)编码愉快!