说明

最近用WPF+DevExpress做项目时,需要做一个类似手风琴的效果,效果的界面如下。因为没有现成的控件,需要自定义模板,所以写了一个Demo和大家分享,项目中可以根据实际情况使用。如果你用不同的方式达到了同样的效果,欢迎一起交流,共同进步。

需求

思路

WPF开发项目的时候,一定要记住一个原则,即数据驱动程序,在WPF中,数据永远是主要的地位,仔细分析上面的数据,可得出如下的结构

Group1

  ParmName1   ParmValue1

  ParmName2   ParmValue2

Group2

  ParmName1   ParmValue1

  ParmName2   ParmValue2

  ParmNameN  ParmValueN

外层的Group数据是一组数据,内层的Info数据也是一组数据,且每一组数据的数据类型相同。WPF中,第一反应想起来的应该是ItemsControl,所以外层应该是一个类似ListBox的控件,内层的类似GridControl的控件,同时还要具有手风琴的效果,这时候就要重写ListBoxItem的样式了。接下来,我们就用ItemsControl+Template来实现我们想要的效果。

源码

<Window x:Class="TestListBox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestListBox"
xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"
xmlns:dxn="http://schemas.devexpress.com/winfx/2008/xaml/navbar"
mc:Ignorable="d"
Title="MainWindow" Height="" Width="">
<Window.Resources>
<DataTemplate x:Key="NavBarItemContentTemplate">
<dxg:GridControl x:Name="GridAttribute" MaxHeight="" ItemsSource="{Binding}">
<dxg:GridControl.Columns>
<dxg:GridColumn FieldName="ParmName"></dxg:GridColumn>
<dxg:GridColumn FieldName="ParmValue"></dxg:GridColumn>
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView x:Name="ViewSimulate" AutoWidth="True" ShowIndicator="False" ShowGroupPanel="False" AllowEditing="True"
AllowColumnFiltering="False" IsColumnMenuEnabled="False"
VerticalScrollbarVisibility="Auto"
ShowColumnHeaders="false"/>
</dxg:GridControl.View>
</dxg:GridControl>
</DataTemplate>
<Style x:Key="ListBoxEditSyle" TargetType="{x:Type dxe:ListBoxEditItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<dxn:NavBarControl Name="navBar">
<dxn:NavBarControl.Groups>
<dxn:NavBarGroup Header="{Binding GroupName}">
<!--<dxn:NavBarItem Content="{Binding Parms}" Template="{StaticResource NavBarItemContentTemplate}" />-->
<ContentControl Content="{Binding Parms}" ContentTemplate="{StaticResource NavBarItemContentTemplate}" />
</dxn:NavBarGroup>
</dxn:NavBarControl.Groups>
</dxn:NavBarControl>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style> </Window.Resources>
<Grid>
<dxe:ListBoxEdit x:Name="LBAttr" Margin="-10,0,0,0" ScrollViewer.VerticalScrollBarVisibility="Auto" Width="" Height="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Disabled" ShowBorder="False"
ItemContainerStyle="{StaticResource ListBoxEditSyle}" AllowCollectionView="True">
</dxe:ListBoxEdit> </Grid>
</Window>

后台源码

数据源的实体类定义
public class ObjAtt
{
public string GroupName { get; set; }
public List<Parm> Parms { get; set; }
} public class Parm
{
public string ParmName { get; set; }
public string ParmValue { get; set; }
}
 public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); LBAttr.ItemsSource = InitItemSource();
} private List<ObjAtt> InitItemSource()
{
List<ObjAtt> objAtts = new List<ObjAtt>(); objAtts.Add(new ObjAtt()
{
GroupName = "大类1",
Parms = new List<Parm>()
{
new Parm() {ParmName = "参数名1",ParmValue = "参数值1"},
new Parm() {ParmName = "参数名2",ParmValue = "参数值2"},
}, });
objAtts.Add(new ObjAtt()
{
GroupName = "大类2",
Parms = new List<Parm>()
{
new Parm() {ParmName = "参数名1",ParmValue = "参数值1"},
new Parm() {ParmName = "参数名2",ParmValue = "参数值2"},
}, });
objAtts.Add(new ObjAtt()
{
GroupName = "大类3",
Parms = new List<Parm>()
{
new Parm() {ParmName = "参数名1",ParmValue = "参数值1"},
new Parm() {ParmName = "参数名2",ParmValue = "参数值2"},
}, });
objAtts.Add(new ObjAtt()
{
GroupName = "大类4",
Parms = new List<Parm>()
{
new Parm() {ParmName = "参数名1",ParmValue = "参数值1"},
new Parm() {ParmName = "参数名2",ParmValue = "参数值2"},
}, }); return objAtts;
}
}

说明

为了达到演示的效果,后台的数据源一开始我就写死了。实际项目开发中,你可以在ViewModel中写获取数据的方法,然后利用WPF中的Binding轻松的将数据源绑定到控件上。

WPF DEV实现手风琴效果的更多相关文章

  1. 基于css3实现手风琴效果

    终于在凌晨一点钟逼迫自己写博客.一直想记录自己的前端工程师之路,但毕竟拖延症晚期.因为第一篇随笔,所以多写一点废话吧.刚刚从学校毕业,放弃了一直学习的java,而想从事前端的工作.第一是觉得osgi这 ...

  2. 使用 jQuery & CSS3 实现优雅的手风琴效果

    手风琴效果常用于切换显示一组内容,这种方式既可以节省网页空间又可以有动画效果.今天,我们将创造一个优雅的手风琴内容效果.这个想法是有悬停时滑出一些垂直手风琴标签.我们将添加一些 CSS3 属性来提升外 ...

  3. 基于 jQuery 实现垂直滑动的手风琴效果

    今天我们要与大家分享一个漂亮而灵活的垂直 jQuery 手风琴效果.其主要思想是扩大手风琴片上的点击和显示更多的信息.其他内容片段将变得不那么透明.当使用一个导航箭头导航下一个片段,新的片会从顶部或底 ...

  4. JS+JQ手风琴效果

    最新在学习JS写一些实用的小玩意——手风琴 CSS样式: <style type="text/css"> * { margin: 0px; border: 0px; p ...

  5. 纯CSS手风琴效果

    CSS手风琴效果 主体代码如下:                                                                                     ...

  6. jquery 图片手风琴效果

    这篇主要是手风琴效果和无缝切换相结合,在Demo里的Demo3.html.Demo4.html. 手风琴原理比较简单,当鼠标经过的时候改变图片的路径,鼠标移到另一张图片时还原路径. 虽然原理简单,但是 ...

  7. 一步步教你css3手风琴效果的实现

    什么是手风琴效果? 首先我们先来看一段动画,如下图所示: 在上面动画中,我们不难发现,一排照片正常排列,当我鼠标移上(:hover)时,照片会变大显示并且把其它照片挤小.那么在鼠标来回移动的过程中,画 ...

  8. WPF绘制党徽(立体效果,Cool)

    原文:WPF绘制党徽(立体效果,Cool) 前面用WPF方式绘制了党旗(WPF制作的党旗) ,去年3月份利用C# 及GDI+绘制过党徽,这次使用WPF来绘制党徽. ------------------ ...

  9. WPF DEV CellTemplateSelector(一个正确使用DevExpress CellTemplateSelector的Demo)

    说明 我在项目中根据需求需要用到WPF Dev CellTemplateSelector时,遇到不少坑.曾一度想要放弃使用模板转换器,但又心有不甘,终于在不断努力下,达到了需求的要求.所以写下来和大家 ...

随机推荐

  1. JVM学习笔记一:内存管理

    参考资料 本文参考:<深入理解Java虚拟机>作者 周志明 知识产权归作者所有 走近java java组成部分:java语言.各平台虚拟机.Class文件结构.java api 类库.第三 ...

  2. python socket.error: [Errno 10054] 解决方法

    我用的是python2.7   我搜网上10054错误解决方法的时候发现,大部分文章都是以python3为基础的,对于python2不适用. python socket.error: [Errno 1 ...

  3. hdu 6093---Rikka with Number(计数)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  4. overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)

    上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ...

  5. VS2010 常见错误类型汇总

    开发路漫漫,尤其对于刚从事开发不久的新手来说,常常遇到一些稀奇古怪的错误,很是头疼,鉴于自己在开发过程中常遇到的几个错误做个分享,希望对大家有所帮助: 错误1: 在创建完win32的DLL后,编译时出 ...

  6. Bat脚本自动卸载软件-静默执行

    通过Bat脚本卸载软件,原理是得到某软件的ProductCode,然后通过MsiExec.exe命令卸载软件,下面是卸载一个产品的基本代码示例: set ML4.0HF4Name=Product4.0 ...

  7. asp.net mvc项目远程发布到windows server服务器

    文章参考 自学MVC看这里——全网最全ASP.NET MVC 教程汇总 图文详解远程部署ASP.NET MVC 5项目 配置Web部署处理程序 设备及环境 一台装有windows server 201 ...

  8. 数据结构-->栈

    首先,栈是什么? 在代码当中,栈主要是一种实现特殊功能的一种数据结构,而不是像数组.集合之类的数据存储工具.它最大的特点就是后进先出. 那么后进先出是什么? 假设有一个数组,我们向里面添加一个数据,再 ...

  9. 设计模式之Iterator模式

    STL里的iterator就是应用了iterator模式. 一.什么是迭代模式 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺 ...

  10. 新入门的小白,整理一下特别简单实用的div+css兼容性的问题。

    最近整理了一下特别简单的div+css的不同浏览器的兼容性的问题,跟大家分享一下,只适合刚入门的新手,欢迎大牛们给提出意见. 1. 默认的内外边距不同 问题: 各个浏览器默认的内外边距不同 解决: * ...