WPF DEV实现手风琴效果

说明

最近用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="400" Width="350">
    <Window.Resources>
        <DataTemplate x:Key="NavBarItemContentTemplate">
           <dxg:GridControl x:Name="GridAttribute" MaxHeight="500" 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="300" 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轻松的将数据源绑定到控件上。

时间: 2024-12-06 08:01:02

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

纯css3实现美化复选框和手风琴效果(详细)

关键技术点和原理: 原理就是把 checkbox或 radio 给隐藏掉   ,然后给选框 绑定一个label标签. 然后用label标签作为容器,在里面放一个:before或一个after 用before模拟选框的框,用after来模拟选框的填充 通过 .magic-checkbox:checked + label:after {/*选框被选中时 显示after填充*/ display: block; } 来确定是否选中复选框,如果checked就把after的显示. 先贴出html的代码 <

CSS3实现手风琴效果-------Day88

所谓的手风琴效果,就是像手风琴一样拉开关上,至于手风琴啥样,貌似那是我好久之前的回忆了. 不扯那些没用的,说说这个坑人的手风琴效果,先来看下效果图: 这个效果不错吧,也比较常用吧,可怜的我最开始的时候以为自己可以做到这个效果,就用display:none/block写了一排的div,你别说,还真出来那个感觉啦,哈哈,这里当然不会这么做,但是在我看明白之后,发现是一样简单到要吐血,这样的应用当初自己怎么就想不到. 实现过程中的第一个让我没想到,却感觉确实这样才对的地方: <div id="h

jQuery插件实例四:手风琴效果[无动画版]

手风琴效果就是内容的折叠与打开,在这个插件中,使用了三种数据来源:1.直接写在DOM结构中:2.将数据写在配置项中:3.从Ajax()中获取数据.在这一版中,各项的切换没有添加动画效果,在下一版中会是有动画效果的. 在这个插件中,CSS和JS的配置非常重要,需要特别注意.另外,加个思考,请先看完后再想这个问题:当点击其中某项时,给width直接添加animate是否合适,当快速在其上移动时,如何保证效果? 效果图预览 插件JS accordionB.js 1 ; 2 (function ($,

手风琴效果

功能描述: 鼠标移到每一个图片上,显示当前图片,其余图片变成宽度为原来的6%,同时图片透明度为1,0.5s后显示图片说明.鼠标移除后,每张照片宽度变为16%的宽度.其中图片说明,没有设计样式,有兴趣的可以自己动手. html代码: <body> <h1>手风琴效果</h1> <div id="content"> <ul> <li> <a href="#"> <h2>图片名

WPF 有趣的动画效果

WPF 有趣的动画效果 这一次我要呈上一个简单的文章,关于给你的WPF apps加入美丽的光线动画,可是我对动画这东西可能有点入迷了. 实际上.我对动画如此的入迷,以至于我最后做了之前从未打算做的东西,就是使用一些很实用的.NET代码,渐变填充生成背景动画.让我先给你看一些终于效果吧. WPF和元素定位 然而.在我们開始之前.我们须要考虑一件事情.这件事让我也有点原地转圈的感觉. 似乎当你使用WPF创建不论什么闭环形状时,你不能设置它的X和Y坐标.好吧.至少你不能在一般的WPF窗口(像VS开箱即

jquery实现简单的手风琴效果

最近看到我看的教学视频有不少手风琴效果,我也试着写一下,当做练习. 明天我放假,就要去找工作,不知道,我的前端之路,能不能正式开始. 菜鸟起飞的机会都没有,那就尴尬了. 纯属练习: 效果如图: html: <ul class="wrap"> <li class="checked"> <span>选项1</span> <div>1</div> </li> <li> <

JS制作图片手风琴效果

使用JS写出 图片的手风琴效果 第一种:浮动版本的手风琴效果,并不推荐,因为会使图片出现抖动的现象 样式则是div中包含ul <script src="animate.js"></script> <script> //1. 找出页面中需要的对象 var box = document.getElementById("box"); var ul = box.children[0]; var lis = ul.children; //2

分享一款jquery+css3实现的手风琴效果代码【js插件】

代码适用于大部分浏览器 演示Demo地址:请猛戳 效果图片 程序吧下载地址 分享一款jquery+css3实现的手风琴效果代码[js插件],布布扣,bubuko.com

用jquery实现手风琴效果

<style type="text/css"> ul li{ list-style: none; width:200px; height:30px; text-align: center; line-height:30px; background-color:deepskyblue; } ul{ display:none; margin:0; padding:0; } h3{ width:200px; height:30px; margin:0; padding:0; te