一  分析阶段

根据 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. AspNetPager分页控件样式的使用

    分页是Web应用程序中最常用到的功能之一,AspNetPager  简单实用,应用到项目后台中,棒极了! 自定义样式: <style type="text/css"> ...

  2. 【干货分享】流程DEMO-采购预算编制

    流程名: 采购预算编制  业务描述: 在月初由计财部进行预算编辑,提交审批后预算生效  流程相关文件: 流程包.xml WebService业务服务.xml WebService.asmx WebSe ...

  3. Android—应用程序开机自启

    android开机时候会发送开机广播,我们想要收到广播知道手机开机,才能启动我们的应用程序. 首先要在配置文件中添加相应权限: <uses-permission android:name=&qu ...

  4. 微信小程序服务范围重大更新

    12.29日,小程序服务范围做了重大更新,增对富媒体和工具类型的小程序,增加了很多细分领域 富媒体:增加资讯,FM电台,有声读物等,媒体平台可上小程序了 工具:信息查询,网络代理,健康,企业管理等 , ...

  5. 【代码笔记】iOS-获得当前的月的天数

    一,代码. #import "ViewController.h" @interface ViewController () @end @implementation ViewCon ...

  6. MySQL 优化之 MRR (Multi-Range Read:二级索引合并回表)

    MySQL5.6中引入了MRR,专门来优化:二级索引的范围扫描并且需要回表的情况.它的原理是,将多个需要回表的二级索引根据主键进行排序,然后一起回表,将原来的回表时进行的随机IO,转变成顺序IO.文档 ...

  7. VPN连接常见错误汇总

    提示远程服务器没有响应. 这种情况有两种情况,一种是远程服务器出现故障.另一种是自己的电脑出现问题,具体原因我还没有找到,但是可以肯定的是注册表除了问题,一个终极的解决办法就是把注册表替换了.先将HK ...

  8. 自定义ConfigSection

      CCustom configuration section with intelisense

  9. windows 部署 git 服务器报 Please make sure you have the correct access rights and the repository exists.错误

    这两天在阿里云上弄windows 服务器,顺便部署了一个git服务.根据网上教程一步步操作下来,最后在 remote远程仓库的时候提示 fatal: 'yourpath/test.git' does ...

  10. 序列化笔记之一:Google的Protocol Buffer格式分析

    从公开介绍来看,ProtocolBuffer(PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.作为一个学了多年通信的人,ProtocolBuffer在我看来是一种信源编码.所谓信 ...