一  场景介绍

Silverlight 5.0 的 C1FlexGrid 控件里自带的滚动条,是嵌入在 C1FlexGrid 宽度和高度的范围里的,效果如下图所示:

(未隐藏自带滚动条)

(隐藏自带的滚动条)

其中行高的定义如下:

<c1:C1FlexGrid x:Name="flxg" Width="300" Height="200"
Grid.Row="0" HeadersVisibility="None"
AlternatingRowBackground="AliceBlue" Background="LightGray"
GridLinesVisibility="All" GridLinesBrush="Black">
<c1:C1FlexGrid.Rows>
<c1:Row Height="100" />
<c1:Row Height="100" />
</c1:C1FlexGrid.Rows>
<c1:C1FlexGrid.Columns>
<c1:Column Width="100" />
<c1:Column Width="100" />
<c1:Column Width="100" />
</c1:C1FlexGrid.Columns>
</c1:C1FlexGrid>

即使把 C1FlexGrid 的行、宽设置成所有 行高和 或所有 列宽和,自带的滚动条还是会显示出来,但实际上如果隐藏掉 C1FlexGrid 自带的滚动条,效果就好看多了,所以就想把 C1FlexGrid 自带的滚动条隐藏掉,然后在下方或右侧加一个自己的滚动条,来操作滚动 C1FlexGrid。

二  解决思路

1、C1FlexGrid 的属性 ScrollPosition 可以获取或设置其自带的滚动条的偏移量;

2、C1FlexGrid 中与滚动有关的事件有,ScrollPositionChanging 和 ScrollPositionChanged,断点调试实验一下即可知道当执行到 ScrollPositionChanged 事件时,C1FlexGrid 的 ScrollPosition 属性值更新为滚动条的偏移量;

3、当 C1FlexGrid 触发 ScrollPositionChanged 事件时,更新自定义滚动条(ScrollBar)的偏移值;自定义滚动条(ScrollBar)的 ValueChanged 事件触发时,更新 C1FlexGrid 的 ScrollPosition 属性值;

4、注意 C1FlexGrid 的 ScrollPosition 属性为负,ScrollBar 的 Value 属性值为正,注意正负转换;

5、ScrollBar 的 Maximum 属性:设置滚动条可滑动的最大值,应等于 C1FlexGrid 可视范围之外的长度或宽度值;

6、ScrollBar 的 ViewportSize 属性:设置滚动条上白条的长度值,应该等于 C1FlexGrid 的宽度值,即可视范围的长度或宽度值;

三  部分代码

根据 C1FlexGrid 初始化滚动条

 /// <summary>
/// 根据 C1FlexGrid 初始化滚动条
/// </summary>
/// <param name="flexGrid"></param>
private void InitScrollbar(C1FlexGrid flexGrid)
{
double allColumnsWidth = 0;
double allRowsHeight = 0;
foreach (Column col in flexGrid.Columns)
{
allColumnsWidth += col.Width.Value;
}
foreach (Row row in flexGrid.Rows)
{
allRowsHeight += row.Height;
}
// 当所有行高和大于 C1FlexGrid 框的高度,则纵向滚动条可用
if (allRowsHeight > flexGrid.Height)
{
scrollbarVert.Visibility = Visibility.Visible;
// 纵向滚动条的最大值应该是 C1FlexGrid 中超出可见范围剩余的高度
scrollbarVert.Maximum = allRowsHeight - flexGrid.Height;
// 滚动条上白条的长度应该是 C1FlexGrid 可见范围的高度
scrollbarVert.ViewportSize = flexGrid.Height;
scrollbarHori.SmallChange = 1;// 滚动改变的最小值
}
else
{
scrollbarVert.Visibility = Visibility.Collapsed;
}
// 当所有列宽和大于 C1FlexGrid 框的宽度,则横向滚动条可用
if (allColumnsWidth > flexGrid.Width)
{
scrollbarHori.Visibility = Visibility.Visible;
// 横向滚动条的最大值应该是 C1FlexGrid 中超出可见范围剩余的宽度
scrollbarHori.Maximum = allColumnsWidth - flexGrid.Width;
// 滚动条上白条的长度应该是 C1FlexGrid 可见范围的宽度
scrollbarHori.ViewportSize = flexGrid.Width;
scrollbarHori.SmallChange = 1;// 滚动改变的最小值
}
else
{
scrollbarHori.Visibility = Visibility.Collapsed;
}
}

C1FlexGrid触发滚动事件

 // C1FlexGrid 的滚动事件
private void flxg_ScrollPositionChanged(object sender, EventArgs e)
{
Point position = flxg.ScrollPosition;// C1FlexGrid 当前滚动条的位置
txtMsg1.Text = "C1FlexGrid: " + position.X + "," + position.Y;
// 更新自定义滚动条
scrollbarHori.Value = -position.X;
scrollbarVert.Value = -position.Y;
}

横/纵滚动条滑动事件

 // 横向滚动条
private void scrollbarHori_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
// 注意,滚动条控件 Scrollbar 的 value 值是正数,与 C1FlexGrid 的滚动条位置正好相反
flxg.ScrollPosition = new Point(-scrollbarHori.Value, flxg.ScrollPosition.Y);
} // 纵向滚动条
private void scrollbarVert_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
// 注意,滚动条控件 Scrollbar 的 value 值是正数,与 C1FlexGrid 的滚动条位置正好相反
flxg.ScrollPosition = new Point(flxg.ScrollPosition.X, -scrollbarVert.Value);
}

四  后话

C1FlexGrid 在 ScrollBar 部分我觉得做的并不精致,当把 C1FlexGrid 的长、宽设置成完全等于所有行高和、所有列宽和时,如上面所说 C1FlexGrid 自带的滚动条会显示出来,如果这时候要完全显示 C1FlexGrid 右下角那个单元格时,滚动条的偏移量为(-3,-3);

所以如果按照我上面的代码执行,然后再把自定义的两个滚动条拉到最下面或最右侧,此时 C1FlexGrid 的滚动条偏移量还差3,如下图所示:

滚动条拉到极端时偏移量显示为(-200,-150)

最后一个单元格完全显示时,偏移量显示为(-203,-153)

所以实际上在给自定义滚动条 ScrollBar 设置最大偏移值时,应另外加3,即 scrollbarVert.Maximum = allRowsHeight - flexGrid.Height + 3;

这样就完全同步了;

[C1] 分离 C1FlexGrid 滚动条的更多相关文章

  1. [C1] 实现 C1FlexGrid 撤销还原功能

    采用设计模式中的"命令模式"实现 C1FlexGrid 的撤销还原功能,那就先从命令模式简单介绍开始吧. 一  命令模式 命令模式属于对象的行为型模式,将一个请求封装为一个对象,从 ...

  2. [C1] 优化 C1FlexGrid 单元格边框

    一  优化理由 如下图所示,如果按照 C1FlexGrid 自带的单元格边框设置,即对每个单元格的 CellStyle 的 BorderThickness 进行设置,会得到如下图的效果: 其中,明显可 ...

  3. C1FlexGrid小结(转自http://www.cnblogs.com/C1SupportTeam/archive/2012/12/11/2812316.html)

    C1FlexGrid控件来对一个表格格式中的数据进行显示,编辑,组和总结.该表格可以绑定到一个数据源,它可以对自己的数据进行管理. C1FlexGrid控件有一个包含以下元素的丰富的对象模型: 以下的 ...

  4. C#++c1FlexGrid+帮助文档09

    摘自: http://3y.uu456.com/bp-e2746s16s2d380eb62946d27-1.html C#:c1FlexGrid帮助文档:Value-MappedLists(值映射列表 ...

  5. Javascript和jquery事件--滚动条事件和自定义滚动条事件样式

    很想把滚动条事件跟鼠标滚轮事件放在一起,那就直接写在这一篇了.除了事件以外,对滚动条样式的调整也记在这里吧. 滚动条是浏览器的默认事件,使用overflow:auto/scroll都有可能出现,它的默 ...

  6. 消除ComponentOne(C1StudioNet_2013v2) 的注册提示

     以后大家如果遇到还有提示,在License文件里添加:C1.Win.C1Command.C1OutBar, C1.Win.C1Command.4, Version=4.0.20132.19568,  ...

  7. c# WinForm 编程总结

    1.清空DataGridView /// <summary> /// 清空DataGridView /// </summary> /// <param name=&quo ...

  8. c# 简单的通用基础字典

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using Alif.Ali ...

  9. UVA196-Spreadsheet(拓扑排序)

    Spreadsheet In 1979, Dan Bricklin and Bob Frankston wrote VisiCalc, the first spreadsheet applicatio ...

随机推荐

  1. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  2. web api接口同步和异步的问题

    一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了. 如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的 ...

  3. C# await和async

    基础阅读:http://www.cnblogs.com/jesse2013/p/async-and-await.html 答疑阅读:http://www.cnblogs.com/heyuquan/ar ...

  4. 声音分贝的概念,dBSPL.dBm,dBu,dBV,dBFS

    需要做个音频的PPM表,看着一堆的音频术语真是懵了,苦苦在网上扒了几天的文档,终于有了点收获,下面关于声音的分贝做个总结. 分贝 Decibel 分贝(dB)是一个对数单位(logarithmic u ...

  5. jQuery个性化图片轮播效果

    jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...

  6. CSS入门常见的问题

    写在前面:本文简单介绍一下css的三大特性:层叠性.继承性.优先级.以及margin,padding,浮动,定位几个知识点.限于水平,不深入探讨,仅作为学习总结. 1,三特性 1)层叠性:同标签同权重 ...

  7. Android之SQLite数据存储

    一.SQLite保存数据介绍 将数据库保存在数据库对于重复或者结构化数据(比如契约信息)而言是理想之选.SQL数据库的主要原则之一是架构:数据库如何组织正式声明.架构体现于用于创建数据库的SQL语句. ...

  8. Linux命令【第二篇】

    1.如何过滤出已知当前目录下oldboy中的所有一级目录(提示:不包含oldboy目录下面目录的子目录及隐藏目录,即只能是一级目录). ^:以什么开头,例如^olboy表示以oldboy开头. ls: ...

  9. Linux实战教学笔记01:计算机硬件组成与基本原理

    标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...

  10. samba服务

    安装samba服务步骤ps -e 查看进程ps -e | grep 文件名 管道符的使用rpm -qa 安装包的查看rpm -qa | grep samba 抓Samba安装包 注释:包与包之间有依赖 ...