[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 里的样式设计的,现在还未加上工作簿,所以中间是空白部分,左边的按钮可在后期定义为工作簿的切换,还有一个新增工作簿,看心情实现吧
博客地址:http://www.cnblogs.com/Memento/
版权声明:Memento所有文章遵循创作共用版权协议,要求署名、非商业、保持一致。在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2014-04-10 [Tool] csdn客户端开发(非官方版)