一  场景介绍

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. JavaScript动画-碰撞检测

    ▓▓▓▓▓▓ 大致介绍 碰撞检测是指在页面中有多个元素时,拖拽一个元素会出现碰撞问题,碰撞检测是以模拟拖拽和磁性吸附中的范围限定为基础的 效果:碰撞检测 ▓▓▓▓▓▓ 碰撞检测 先来看看碰撞检测的原理 ...

  2. angular 源码分析 1 - angularInit()

    angularjs 是个神奇的框架,由于我的好奇,想了解她的内部工作原理,只能一步一步的走进她,靠近她,和她深入的交流. angularjs 的入口是什么样子的呢?一起掀起她的盖头吧. 在这里我只讲方 ...

  3. History API与浏览器历史堆栈管理

    移动端开发在某些场景中有着特殊需求,如为了提高用户体验和加快响应速度,常常在部分工程采用SPA架构.传统的单页应用基于url的hash值进行路由,这种实现不存在兼容性问题,但是缺点也有--针对不支持o ...

  4. ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件

    作者: Rick Anderson 翻译: 娄宇(Lyrics) 校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图 ...

  5. ResponsibleChain(责任链模式)

    /** * 责任链模式 * @author TMAC-J * 老板讲任务交给CTO,CTO自然不会亲自去做,又把人物分配给项目经理,项目经理再把任务分配给组长,组长再分配给个人 * 如果中途哪个环节出 ...

  6. Android Retrofit 2.0 使用-补充篇

    推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...

  7. Java 中获取类路径 classpath 的方法

    System.out.println("++++++++++++++++++++++++"); String path = System.getProperty("jav ...

  8. Concurrency

    <Concurrency>:http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html <Java ...

  9. 数据分布转换:非正态 -> 正态

    来源:丁香园论坛:SPSS上的把非正态分布数据转换为正态分布数据 一楼 可以应用变量变换的方法,将不服从正态分布的资料转化为非正态分布或近似正态分布.常用的变量变换方法有对数变换.平方根变换.倒数变换 ...

  10. CacheManager:–个通用缓存接口抽象类库

    CacheManager是–个缓存通用接口抽象类库,它支持各种高速缓存提供者,例如Memcache,Redis,并且有许多先进的功能特性.具体可以访问官方网站  http://cachemanager ...