none
[Xue, Bob HELP PLEASE]~请问如何自定义GridView/ListView中每个分组的面板样式,即GroupStyle中的Panel? RRS feed

  • 问题

  • 问题场景:通过设置数据源,一个GridView有了三个Group, 分别为A、B、C

    我想知道如何让它们使用指定的面板?

    如果我这样写,

    <GirdView.GroupStyle>
    	<GroupStyle.Panel>
    		<ItemsPanelTemplate>
                                <!--这里定义-->
                                <VariableSizedWrapGrid .../>
    		</ItemsPanelTemplate>
    	</GroupStyle.Panel>
    </GirdView.GroupStyle>

    那么分组的布局面板都会一样(VariableSizedWrapGrid):

    A       B         C
    □□    □□□     □□□□□
    □      □□       □□□□  

    但如果我想B采用不同的面板(比方说水平方向的Stackpanel),我该如何做?

    A         B             C
    □□    □□□□□     □□□□□
    □                      □□□□ 


    搜索了大半天,我得知GroupStyleSelector无法解决(设计初衷所致),

    我还从Aaron Xue版主在以下的解答中得到灵感:

    ht tp://social.msdn.microsoft.com/Forums/zh-CN/winstoreappzhcn/thread/c8a459df-8d9a-4c37-82b1-e6811c74ef78/

    想绑定GroupStyle的Panel属性,但是没有效果,实际上应该也不支持绑定:

    <GroupStyle Panel="{Binding MyPanel}">
        ...
    </GroupStyle>

    请问大家,如何解决这个问题?

    Aaron Xue大大,麻烦也顺便说说完整的解决方案啦 ^_^






    2013年4月20日 14:08

答案

全部回复

  • 放置一个Resource 元素,他可以是一个自定义的对象

        <Page.Resources>
    
            <tt:test x:Key="test"/>
            <CollectionViewSource x:Name="cvs2" IsSourceGrouped="true" />
        </Page.Resources>

    这个元素包含属性 MaximumRowsOrColumns 的整型值

        public class test
        {
            public int xx { get { return ??; } }
        }

    然后你可以在你的

                        <GroupStyle.Panel>
                            <ItemsPanelTemplate>
                                <VariableSizedWrapGrid Orientation="Horizontal" Height="400" MaximumRowsOrColumns="{Binding Source={StaticResource test}, Path=xx}"/>
                            </ItemsPanelTemplate>
                        </GroupStyle.Panel>

    来绑定。

    这样你可以根据你要的Group 来指定这个值是1还是>1的值来达到你要的效果。


    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。


    2013年4月21日 15:33
    版主
  • Bob您好,感谢提供这个方法,

    但其实我还有一个Group的排版是要类似Canvas的,这应该怎么处理好:

    • 已编辑 Kitty Yue 2013年4月22日 3:48 加入图片
    2013年4月22日 2:33
  • 因为GroupStyle的ItemPanel本身这个值仅存在在逻辑树中,实际可视树并没有一个特定的ItemPanel节点,所以直接绑定是达不到效果的。我们没有办法绑定ItemPanel,但是我的想法是,我们可以设计一个自定义控件,然后将这个自定义控件作为你的ItemPanel 这个控件可以在属性值下返回Canvas效果和一般的WrapGrid效果。我觉得一个自定于Panel可以实现了。

    还有,我的想法是,基于StaticResource和converter,在绑定的时候来返回一个特定的Panel:

    <ItemPanel>
        <ContentControl Content="{Binding Source={StaticResource XXX}, Converter=....}"/>
    </ItemPanel>




    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年4月22日 4:01
    版主
  • Bob,

    您的意思是这样吗:

    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <!--这个myPanel继承自Panel-->
            <local:myPanel .../>
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>

    此外,应该对自定义Panel的哪个属性使用StaticResource和converter?

    ContentControl好像不能用在这里吧?

    ItemsPanel的类型是ItemsPanelTemplate,ItemsPanelTemplate中也不能用ContentControl,会报异常: "The ItemsControl.ItemsPanelTemplate must have a derivative of Panel as the root element."


    2013年4月22日 4:51
  • myPanel 应该可以做到实现不同的Panel的行为

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年4月22日 5:00
    版主
  • 挺难的啊,前面尝试过一直不成功,实在没什么思路用一个自定义Panel做几种自适应的布局
    2013年4月26日 2:48
  • ???

    2013年4月26日 4:33
  • 顶楼上。 确实应该这样。

    Bob Bao

    Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
    你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年4月28日 2:24
    版主