一  场景介绍

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. 玩转spring boot——结合redis

    一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...

  2. asp.net mvc 验证码

    效果图 验证码类 namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // Validat ...

  3. C# 泛型

    C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...

  4. 如何使用dos命令打开当前用户、当前日期、当前时间以及当前用户加当前时间?

    1.dos命令安装mysqld --stall.启动net start mysql.进入MySQL数据库mysql -uroot -p后,输入select user();当前用户 select cur ...

  5. Java企业实训 - 01 - Java前奏

    前言: 虽然个人专攻.NET方向,不过由于个人是干教育行业的,方方面面的东西,不能说都必须精通,但肯定多少都会涉及到. 一个菜鸟学员,从啥都不会,经过一步步学习,最后到企业上手掌管一个模块甚至一个项目 ...

  6. Linux下用netstat查看网络状态、端口状态(转)

    转:http://blog.csdn.net/guodongdongnumber1/article/details/11383019 在linux一般使用netstat 来查看系统端口使用情况步.  ...

  7. 闭区间套定理(Nested intervals theorem)

    ① ②这里用到了极限与不等关系 ③如果a≠b,那么便不会有$\lim _{n\rightarrow \infty }\left| I_n \right| =0$ ④如果还存在一点c在内,那么同样也不会 ...

  8. intellij idea 13&14 插件推荐及快速上手建议

    IntelliJIDEA插件安装 首页 > blog Tags : intellij IDEA插件安装 更新日期: 2015-04-29 IntelliJ IDEA插件下载地址: http:// ...

  9. 我叫Twenty,我是要成为博客王的博客框架

    标题套用了路飞的格式,其实我想说的是大多数都不相信你的梦想,直到你快走到了. 不废话了,介绍一下twenty: 这是基于CMS框架 zerojs打造一个博客.zerojs 的架构介绍在这里http:/ ...

  10. hibernate一对一主键单向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...