[C1] 仿 Excel 实现(C1FlexGrid)
一 分析阶段
根据 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)的更多相关文章
- 浏览器仿EXCEL表格插件 - 智表ZCELL产品V1.4发布
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.2更新
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3.1更新
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- 浏览器仿EXCEL表格插件 版本更新 - 智表ZCELL产品V1.3发布
智表(zcell)是一款浏览器仿excel表格jquery插件.智表可以为你提供excel般的智能体验,支持双击编辑.设置公式.设置显示小数精度.下拉框.自定义单元格.复制粘贴.不连续选定.合并单元格 ...
- Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格
目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...
- 网页版仿Excel效果组件--handsontable拓展运用
引言(祝看官们新年万事大吉) 前段时间项目需要实现网页版的excel表格功能,瞬间就想到了handsontable,为什么呢?理由如下:该UI组件功能齐全多样,展示效果也更贴近bootstrap风格, ...
- 我为什么要花大力气从头研发智表ZCELL(一个仿EXCEL的前端插件)
为什么呢,一个前端用的,类似EXCEL的操作的JS 插件,从头研发真的有必要吗?可能你会觉得没有必要吧,其实我自己也问过自己好多遍.因为业界有更加强大的spreadjs,也有比较轻型的JEXCEL,自 ...
- Handsontable-一款仿 Excel效果的表格插件使用总结 96
最近在做一个关于报表管理的项目,发现了一款很好用的jQuery插件-Handsontable.它真的特别给力,在 Excel 中可进行的操作,你几乎都可以在网页中做到,如拖动复制.Ctrl+C .Ct ...
- CSS 仿Excel表格功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- 模拟AngularJS之依赖注入
一.概述 AngularJS有一经典之处就是依赖注入,对于什么是依赖注入,熟悉spring的同学应该都非常了解了,但,对于前端而言,还是比较新颖的. 依赖注入,简而言之,就是解除硬编码,达到解偶的目的 ...
- 开发者接入 基本配置 服务器配置 out.aspx
页面代码: 前段为默认的,什么都不用写,后台如下: 即可 来自为知笔记(Wiz)
- UWP开发之Mvvmlight实践八:为什么事件注销处理要写在OnNavigatingFrom中
前一段开发UWP应用的时候因为系统返回按钮事件(SystemNavigationManager.GetForCurrentView().BackRequested)浪费了不少时间.现象就是在手机版的详 ...
- 【HanLP】资料链接汇总
Java中调用HanLP配置 HanLP自然语言处理包开源官方文档 了解HanLP的全部 自然语言处理HanLP 开源自由的汉语言处理包主页 GitHub源码 基于hanLP的中文分词详解-MapRe ...
- ls: 无法访问/usr/sbin/smartctl: 没有那个文件或目录
环境:RHEL6.5 + Oracle 11.2.0.4 RAC 在安装RAC时,检查时缺少包 cvuqdisk-1.0.9-1,oracle提供脚本修复安装. 但在执行时报错: [root@orad ...
- Oracle 数据库语句大全
Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...
- SAP CRM 显示消息/在消息中进行导航
向用户展示消息,在任何软件中都是十分重要的. 在SAP CRM WEB UI中展示消息,不是一项很难的任务,只需要创建消息并在之后调用方法来显示它 消息类和消息号: 我在SE91中创建了如下的消息类和 ...
- 敏捷转型历程 - Sprint3 一团糟的演示会
我: Tech Leader 团队:团队成员分布在两个城市,我所在的城市包括我有4个成员,另外一个城市包括SM有7个成员.另外由于我们的BA离职了,我暂代IT 的PO 职位.PM和我在一个城市,但他不 ...
- 鱼眼模式(Fisheye projection)的软件实现
简单实现 鱼眼模式(Fisheye)和普通的透视投影(Perspective projection),一个很大的区别就是鱼眼的投影算法是非线性的(non-linear),实际照相机的情况是在镜头外面包 ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...