一  分析阶段

根据 Excel 表格区域的划分,如下图,基本上以4行*3列的框架搭建;

第一行为列头区域     ==>  C1FlexGrid.ColumnHeaders

第二行为单元格区域  ==>  C1FlexGrid.Cells

第三行为列尾区域     ==>  C1FlexGrid.ColumnFooters

第四行为横向滚动条区域,在 Excel 里还有工作簿页签等;

第一列为行头区域     ==>  C1FlexGrid.RowHeaders

第二列为单元格区域

第三列为纵向滚动条区域;

在 CFlexGrid 里还有 BottomLeftCells,TopLeftCells 两个区域,楼主做了一个 Demo,然后把各个区域用背景色标识区域,如下图:

二  扩展 C1FlexGrid 框架

在 Silverlight 中新建一个模版化控件,

将该模版化控件继承于 C1FlexGrid,并在构造函数中默认初始化50行10列;代码如下:

public class SLFlexGridExt : C1FlexGrid
{
/// <summary>
/// 构造函数
/// </summary>
public SLFlexGridExt()
{
this.DefaultStyleKey = typeof(SLFlexGridExt) // 默认添加50行10列
for (int i = 0; i < 50; i++)
{
Rows.Add(new Row())
}
for (int c = 0; c < 10; c++)
{
Columns.Add(new Column())
}
}
}

接着在自动生成的 Themes/Generic.xaml 中对该模版化控件进行样式设置;

<!-- style for main control -->
<Style TargetType="local:SLFlexGridExt">
<!-- properties -->
<Setter Property="FontFamily" Value="Arial" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="RowBackground" Value="{StaticResource _RowBackground}" />
<Setter Property="AlternatingRowBackground" Value="{StaticResource _AlternatingRowBackground}" />
<Setter Property="HeaderGridLinesBrush" Value="{StaticResource _HeaderGridLinesBrush}" />
<Setter Property="GridLinesBrush" Value="{StaticResource _GridLinesBrush}" />
<Setter Property="FrozenLinesBrush" Value="{StaticResource _FrozenLinesBrush}" />
<Setter Property="GroupRowBackground" Value="{StaticResource _GroupRowBackground}" />
<Setter Property="CursorBackground" Value="{StaticResource _CursorBackground}" />
<Setter Property="SelectionBackground" Value="{StaticResource _SelectionBackground}" />
<Setter Property="RowHeaderBackground" Value="{StaticResource _RowHeaderBackground}" />
<Setter Property="ColumnHeaderBackground" Value="{StaticResource _ColumnHeaderBackground}" />
<Setter Property="TopLeftCellBackground" Value="{StaticResource _TopLeftCellBackground}" />
<Setter Property="BottomRightCellBackground" Value="{StaticResource _BottomRightCellBackground}" /> <!-- Excel behavior by default -->
<Setter Property="AllowDragging" Value="None" />
<Setter Property="AllowSorting" Value="False" />
<Setter Property="AllowResizing" Value="Both" />
<Setter Property="ShowMarquee" Value="True" />
<Setter Property="GridLinesVisibility" Value="All" />
<Setter Property="ClipboardCopyMode" Value="ExcludeHeader" />
<Setter Property="ClipboardPasteMode" Value="ExcludeHeader" />
<Setter Property="KeyActionTab" Value="MoveAcross" />
<Setter Property="AreRowGroupHeadersFrozen" Value="False" /> <Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:SLFlexGridExt">
<Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<Grid x:Name="_root">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<!-- vertical scrollbar -->
<ScrollBar x:Name="_sbV" Orientation="Vertical" Grid.Column="2" Grid.RowSpan="2" />
<!-- horizontal scrollbar -->
<ScrollBar x:Name="_sbH" Orientation="Horizontal" Grid.Row="3" Grid.ColumnSpan="3" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

这样以后就可以在其他界面里添加该扩展的 C1FlexGrid 控件,

先添加该扩展控件所在命名空间:

xmlns:my="clr-namespace:Memento.SLFlexGrid;assembly=SLFlexGrid"

然后添加该控件

<my:SLFlexGridExt x:Name="flex" Grid.Row="2" Margin="0 4 0 0" />

即可,预览效果如下图:

现在还是跟未扩展前的 C1FlexGrid 差不多,

接下来就要像 Excel 那样,在左下角加入切换工作簿的两个按钮,和工作簿页签的 TabControl,以及添加新工作簿的按钮,

只要在之前扩展的基础上,修改 Themes/Generic.xaml,定义想要的样式布局即可:

<Grid x:Name="_tabHolder" Grid.Row="3" Grid.ColumnSpan="2" Background="DarkGray">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<StackPanel x:Name="_spButtonPanel" Orientation="Horizontal">
<Button Height="20" Width="20" />
<RepeatButton Height="20" Width="20" />
<RepeatButton Height="20" Width="20" />
<Button Height="20" Width="20" />
</StackPanel>
<c1:C1TabControl x:Name="_tabs" Grid.Column="1" FontSize="12" Padding="0" Margin="0 -1 0 0" IsTabStop="False" TabItemShape="Sloped" TabStripPlacement="Bottom" TabStripOverlap="8" />
</Grid> <!-- horizontal scrollbar -->
<ScrollBar x:Name="_sbH" Orientation="Horizontal" Grid.Column="2" />
</Grid>

效果如下图,这里楼主是按照 ComponentOne 官网提供的 ExcelBook.5Demo 里的样式设计的,现在还未加上工作簿,所以中间是空白部分,左边的按钮可在后期定义为工作簿的切换,还有一个新增工作簿,看心情实现吧

[C1] 仿 Excel 实现(C1FlexGrid)的更多相关文章

  1. 浏览器仿EXCEL表格插件 - 智表ZCELL产品V1.4发布

    智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...

  2. 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.2更新

    智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...

  3. 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.1更新

    智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...

  4. 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3发布

    智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...

  5. Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格

    目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...

  6. 网页版仿Excel效果组件--handsontable拓展运用

    引言(祝看官们新年万事大吉) 前段时间项目需要实现网页版的excel表格功能,瞬间就想到了handsontable,为什么呢?理由如下:该UI组件功能齐全多样,展示效果也更贴近bootstrap风格, ...

  7. 我为什么要花大力气从头研发智表ZCELL(一个仿EXCEL的前端插件)

    为什么呢,一个前端用的,类似EXCEL的操作的JS 插件,从头研发真的有必要吗?可能你会觉得没有必要吧,其实我自己也问过自己好多遍.因为业界有更加强大的spreadjs,也有比较轻型的JEXCEL,自 ...

  8. Handsontable-一款仿 Excel效果的表格插件使用总结 96

    最近在做一个关于报表管理的项目,发现了一款很好用的jQuery插件-Handsontable.它真的特别给力,在 Excel 中可进行的操作,你几乎都可以在网页中做到,如拖动复制.Ctrl+C .Ct ...

  9. CSS 仿Excel表格功能

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. Jquery(1)

    鼠标点击事件: <input type="button" value="测试" onclick="test()" /> < ...

  2. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  3. select、poll、epoll之间的区别总结

    select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...

  4. iOS微信里打开app,Universal Links

    这两天在弄分享,从第三方应用或者浏览器打开自己app的东西 传统的方式是通过URL Scheme的方式,但是iOS9以后又出了新的更完美的方式Universal Links. 传统的URL Schem ...

  5. JAVA构造时成员初始化的陷阱

    让我们先来看两个类:Base和Derived类.注意其中的whenAmISet成员变量,和方法preProcess(). 情景1:(子类无构造方法) class Base { Base() { pre ...

  6. python 数据类型 ----字典

    字典由一对key:value 组成的 python中常用且重量级的数据类型 1. key , keys, values 字典由一对key:value 组成的 python中常用且重量级的数据类型 1. ...

  7. 微信小程序开发日记——高仿知乎日报(下)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

  8. AlloyTouch实战--60行代码搞定QQ看点资料卡

    原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/kandian 先验货 访问DEMO你也可以点击这里 源代码可以点击这里 如你体验所见,流程的滚动的 ...

  9. Android—基于GifView显示gif动态图片

    android中显示gif动态图片用到了开源框架GifView 1.拷GifView.jar到自己的项目中. 2.将自己的gif图片拷贝到drawable文件夹 3.在xml文件中设置基本属性: &l ...

  10. 解决maven下载jar慢的问题(如何更换Maven下载源)

    修改 配置文件 maven 安装 路径 F:\apache-maven-3.3.9\conf 修改 settings.xml 在 <mirrors> <!-- mirror | Sp ...