none
有关VariableSizedWrapGrid和VariableSizedStackPanel RRS feed

  • 问题

  • 请问为什么我的Gridview的ItemsPanel属性使用VariableSizedStackPanel可以放置并显示不同大小的方块,而使用VariableSizedWrapGrid和WrapGrid却不能显示不同大小的方块。那么VariableSizedWrapGrid和WrapGrid的区别在哪里呢?相关代码如下:

    //数据源

    <CollectionViewSource x:Name="cvs2"
                                  Source="{Binding Groups}"
                                  IsSourceGrouped="True" 
                                  ItemsPath="Items"
                                  d:Source="{Binding ItemGroups, Source={d:DesignInstance Type=data:DataGroup, IsDesignTimeCreatable=True}}"/> 

    //数据模板

    <DataTemplate x:Key="ItemTemplate">
                <Grid Background="White">
                    <Image Source="{Binding wbmp}" 
                           Stretch="Fill" 
                           Width="{Binding width}" 
                           Height="255" />
                </Grid>
            </DataTemplate>

    //Gridview

    <GridView x:Name="itemGridViewout"

    Margin="-20,0,0,0" ItemsSource="{Binding Source={StaticResource cvs2}}" ItemTemplate="{StaticResource ItemTemplate}"> <GridView.GroupStyle> <GroupStyle> <GroupStyle.HeaderTemplate> <DataTemplate> <Grid Background="#ff2A2A2A" Width="35" Height="35" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="55,35,0,0"> <TextBlock Text="{Binding Index}" VerticalAlignment="Center" TextAlignment="Center"></TextBlock> </Grid> </DataTemplate> </GroupStyle.HeaderTemplate> <GroupStyle.Panel> <ItemsPanelTemplate> <VariableSizedWrapGrid Margin="90,-35,0,0"/> </ItemsPanelTemplate> </GroupStyle.Panel> </GroupStyle> </GridView.GroupStyle> <GridView.ItemsPanel> <ItemsPanelTemplate> <VariableSizedWrapGrid Orientation="Vertical"/> </ItemsPanelTemplate> </GridView.ItemsPanel> </GridView>

    截图如下:

    上图使用VariableSizedStackPanel可以显示不同大小的方块,可是只能一列或一行,不满足我的需求。

    上图使用VariableSizedWrapGrid可以呈网格状排列方块,可是就算我给每个方块赋不同的值,每个方块的大小是相同的。

    请问哪里出问题了呢?谢谢!

    2012年4月24日 2:38

答案

  • 咱们先来做名字分析:

    WrapGrid和StackPanel: 根据之前的WPF和Silverlight相同的布局概念,前者是一个溢出换行的Grid网格布局,他的特性是内容会在没有指定大小的情况下撑满一个网格单元格的区域。而且WrapGrid仍然属于一个网格布局,会保持每个单元格大小一致,所以他会在这里显示出每个方块大小相同的结果。即使他的内容大于单元格大小,超出区域部分会被隐藏。   后者叫做栈布局,指里面元素会在一个方向上一次排列,可以使横向或者竖向。元素大小会撑满非排列方向。例如横向排列,则元素在没有指定高度的情况下撑满其栈面板高度。

    然后是 VariableSized:可变大小的。他会根据内容元素大小来变化他的大小。但是并没有 VariableSizedStackPanel 这个布局,请你确认下,是否名字看错了,将VirtualizingStackPanel看成了VariableSized。VirtualizingStackPanel是支持虚拟化的栈布局。

    然而目前 VariableSizedWrapGrid和WrapGrid的行为看上去是一样的,这个已经被报告为一个bug了,他们应该是不一样的。http://social.msdn.microsoft.com/Forums/en-us/winappswithcsharp/thread/569e048a-9f5e-4fb3-870a-380de5906e80


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月26日 4:00
    版主

全部回复

  • 咱们先来做名字分析:

    WrapGrid和StackPanel: 根据之前的WPF和Silverlight相同的布局概念,前者是一个溢出换行的Grid网格布局,他的特性是内容会在没有指定大小的情况下撑满一个网格单元格的区域。而且WrapGrid仍然属于一个网格布局,会保持每个单元格大小一致,所以他会在这里显示出每个方块大小相同的结果。即使他的内容大于单元格大小,超出区域部分会被隐藏。   后者叫做栈布局,指里面元素会在一个方向上一次排列,可以使横向或者竖向。元素大小会撑满非排列方向。例如横向排列,则元素在没有指定高度的情况下撑满其栈面板高度。

    然后是 VariableSized:可变大小的。他会根据内容元素大小来变化他的大小。但是并没有 VariableSizedStackPanel 这个布局,请你确认下,是否名字看错了,将VirtualizingStackPanel看成了VariableSized。VirtualizingStackPanel是支持虚拟化的栈布局。

    然而目前 VariableSizedWrapGrid和WrapGrid的行为看上去是一样的,这个已经被报告为一个bug了,他们应该是不一样的。http://social.msdn.microsoft.com/Forums/en-us/winappswithcsharp/thread/569e048a-9f5e-4fb3-870a-380de5906e80


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月26日 4:00
    版主
  • 谢谢Bob的分析!

    我确实是看错了名字了,在应用里面一个一个地试用控件时,发现只有virtualizingstackpanel才能实现不同大小的方块的布局,后来就没注意名字,把它当作variablesizedstackpanel来使用了。

    请问一下,我可以在哪里查询到已知的bug列表吗?

    当我不知道这个bug的时候,我花了大量的时间去试用各种控件来测试效果,结果却因为这是一个bug而无法实现我想要的功能,实在很让人失望,也很打击开发者!

    2012年4月26日 4:58
  • 并不会公开这些bug,只有实时关注例如blog,论坛等平台了。

    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月26日 5:26
    版主