原文:WPF - Group分组对ListBox等列表样式的约束

  在做WPF主题支持时,出现一个分组引起的莫名错误,可是折腾了我一番。在没有使用样式时,列表分组很正常,使用了别人写的ListBox列表样式后,发现GroupItem分组区没有内容,是空的,本篇把这一问题的解决过程给大家说一下,做主题时可以注意分组对列表样式的限制了。

ListBox增加分组

  WPF为ItemsControl提供很多的样式扩展,要想实现列表分组也很简单,只需要做以下几步就可以了:

  1. 给列表控件增加分组样式

    代码

    <Style x:Key="GroupContainerStyle" TargetType="{x:Type GroupItem}">
    <Setter Property="Template">
    <Setter.Value>
    <ControlTemplate TargetType="{x:Type GroupItem}">
    <Expander IsExpanded="True">
    <Expander.Header>
    <Grid>
    <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
    <RowDefinition/>
    </Grid.RowDefinitions>
    <StackPanel Orientation="Horizontal" Margin="0,0,10,0">
    <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" />
    <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount, StringFormat=(共{0}条)}"/>
    </StackPanel>
    <Line Grid.Column="1" SnapsToDevicePixels="true" X1="0" X2="1" Stretch="Fill" StrokeThickness="1"/>
    </Grid>
    </Expander.Header>
    <ItemsPresenter />
    </Expander>
    </ControlTemplate>
    </Setter.Value>
    </Setter>
    </Style>

    GroupStyle gs = new GroupStyle();
    gs.ContainerStyle = Application.Current.TryFindResource("GroupContainerStyle") as Style;
    lbModule.GroupStyle.Add(gs);
  2. 给数据增加分组

    代码

    <UserControl.Resources>
    <CollectionViewSource Source="{x:Static oea:ApplicationModel.DefaultBusinessObjectInfos}" x:Key="cvs">
    <CollectionViewSource.GroupDescriptions>
    <PropertyGroupDescription PropertyName="Catalog" />
    </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
    </UserControl.Resources>

使用ListBox样式后

  用了别人的一个ListBox样式文件,样式如下:

代码

<Style TargetType="{x:Type ListBox}">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" />
<Setter Property="BorderBrush">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="{DynamicResource PrimaryColor}" Offset="0" />
<GradientStop Color="{DynamicResource SecondaryColor}" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="ScrollViewer.CanContentScroll" Value="true" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="1" CornerRadius="4,4,4,4">
<Grid>
<ScrollViewer Padding="{TemplateBinding Padding}" Focusable="false" x:Name="scrollViewer">
<StackPanel Margin="2" IsItemsHost="true"/>

<!--<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />-->
</ScrollViewer>
<Border CornerRadius="4,4,4,4" Visibility="Collapsed" x:Name="border" Margin="-2,-2,-2,-2">
<Border.Background>
<SolidColorBrush Color="{DynamicResource DisabledColor}"/>
</Border.Background>
</Border>
</Grid>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Visibility" TargetName="border" Value="Visible"/>
</Trigger>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

用完之后运行发现界面不对,点击分组标题后列表内容没有显示???

  

查找原因

  自己想了一下,原因不明,无奈自己对WPF实现只了解一点,于是网上搜索ItemsPresenter empty,找到第一条网页ItemsPresenter + ItemsPanelTemplate vs Panel marked with IsItemsHost,进去后发现他提出了一个问题,就是在分组时如何取ItemsPresenter,发现Reflector工具可以看到以下代码:

代码

internal static ItemsPresenter FromGroupItem(GroupItem groupItem)
{
if (groupItem == null)
{
return null;
}
Visual parent = VisualTreeHelper.GetParent(groupItem) as Visual;
if (parent == null)
{
return null;
}
return (VisualTreeHelper.GetParent(parent) as ItemsPresenter);
}

这个帖子上面也解释了为什么这么设计,我就不再重复了,原来在分组时对控件样式有要求,那就是控件样式必须存在ItemsPresenter。

确认原因

使用《WPF - Visual调试工具Snoop》工具查看一下,发现GroupItem下的ItemsPresenter是空的

切换回不使用样式再看看,发现在GroupItem之上有一个ItemsPresenter,而应用上面样式之后就没有了,果然就是样式文件的控件模板缺少ItemsPresenter的原因。

解决问题

原因知道了,解决问题也就非常简单了,修改样式表,主要就是把

<StackPanel Margin="2" IsItemsHost="true"/>

该为

<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"

修改后再次运行,界面正确,如下:

更多内容: 开源信息系统开发平台之OpenExpressApp框架.pdf

欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]

WPF - Group分组对ListBox等列表样式的约束相关推荐

  1. 【WPF】拖拽ListBox中的Item

    原文:[WPF]拖拽ListBox中的Item 整理了两个关于WPF拖拽ListBox中的Item的功能.项目地址 https://github.com/Guxin233/WPF-DragItemIn ...

  2. GROUP BY 子句中 选择列表中的列无效,因为该列没有包含在聚合函数或

    T-SQL核心语句形式: SELECT     --指定要选择的列或行及其限定  [INTO ]      --INTO子句,指定结果存入新表 FROM      --FROM子句,指定表或视图 [W ...

  3. signalr中Group 分组群发消息的简单使用

    前一段时间写了几篇关于signalr的文章 1.MVC中使用signalR入门教程 2.mvc中signalr实现一对一的聊天 3.Xamarin android中使用signalr实现即时通讯 在平 ...

  4. wxpython制作表格界面_Python wxPython库使用wx.ListBox创建列表框示例

    本文实例讲述了Python wxPython库使用wx.ListBox创建列表框.分享给大家供大家参考,具体如下: 如何创建一个列表框? 列表框是提供给用户选择的另一机制.选项被放置在一个矩形的窗口中 ...

  5. html无序列表空心圆_列表样式的使用CSS入门基础(018)

    今天我们分享关于列表样式的内容.列表项list-sytle-type:在HTML学习中,我们知道有有序列表和无序列表,都是使用type属性来定义的.1.有序列表  有序列表  有序列表  有序列表 属 ...

  6. php文章列表样式,css列表样式有哪些?css设置列表样式的方法

    关于列表的css样式有哪些以及如何设置css列表样式?接下来的这篇文章将为大家介绍关于css列表样式的内容. 1.css有序列表(ol)和css无序列表(ul) list.html 列表样式 水果 苹 ...

  7. CSS中列表样式的简介

    什么是CSS列表样式: 所谓的CSS列表样式,肯定和列表有关,但是列表我们要清楚地是,列表可以分为有序列表和无序列表.于是我们的列表样式又可以分为三种类型,第一是设置不同形状的标记的无序列表,第二是设 ...

  8. WPF中Expander与ListBox(ItemsControl)嵌套中的问题

    原文:WPF中Expander与ListBox(ItemsControl)嵌套中的问题 1. 当ListBox放在Expander中时,为了要实现实时更新数据的效果,这里使用了 ObservableC ...

  9. python把列表样式的字符串重新转换为列表

    做数据分析是,遇到这么个问题,一个变量原来是一个列表,为了存储方便,或者是读取过程中的问题,变成了列表样式的字符串, 如下图: 这个看上去是列表,而且也想把它变成列表,问题是它是字符串,双引号里面的字 ...

最新文章

  1. centoros 环境安装
  2. 设备树学习之(二)点灯【转】
  3. 计算机的桌面教案,《认识计算机桌面》教案-20210608141312.pdf-原创力文档
  4. mysql+提升更新语句效率_MySQL加快批量更新 UPDATE优化
  5. Examining Open vSwitch Traffic Patterns
  6. 存储过程 while is null_java 自动化 使用存储过程构造测试数据
  7. c# 批量mqtt_c# mqtt服务器
  8. elasticsearch数据备份还原
  9. android imageview 事件传递,Android 事件传递机制TextView,ImageView等没有默认clickable属性的View单独设置onTouch事件注意事项...
  10. pdf转txt出现句子异常中断,如何连接被切断的字符串
  11. oracle 10g perl,perl中访问oracle10g入门
  12. Ventoy+WePE 装机教程
  13. 基于51单片机的多路温度采集控制系统的设计
  14. 写易班微信小程序遇到了一点问题
  15. 关于站内搜索的那些事儿
  16. 计算机里不显示u盘盘符,U盘不显示盘符怎么办 U盘没了盘符解决方法【详解】...
  17. 从 拼多多 到 抖音
  18. python英语词汇量测试_非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本!...
  19. 【图像去噪】基于matlab高斯+均值+中值+双边滤波图像去噪【含Matlab源码 1872期】
  20. 微信小程序搭建怎么做?流程是怎么样?【小程序搭建】

热门文章

  1. addr2line命令
  2. Makefile_05:Make命令的自动推导
  3. 包含了主机名到ip地址的映射关系的文件是什么 ?
  4. 数据结构:O(nlogn)算法
  5. python三十二:os模块
  6. JVM调优常用参数配置
  7. Hexo+OSChina(码云)+git 搭建个人博客
  8. Css相对定位和绝对定位实现CSDN标题栏
  9. MultiProcess-MultiThread
  10. 多台服务器通过ssh 无密钥直接登陆主机