[C1] 分离 C1FlexGrid 滚动条
一 场景介绍
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 滚动条的更多相关文章
- [C1] 实现 C1FlexGrid 撤销还原功能
采用设计模式中的"命令模式"实现 C1FlexGrid 的撤销还原功能,那就先从命令模式简单介绍开始吧. 一 命令模式 命令模式属于对象的行为型模式,将一个请求封装为一个对象,从 ...
- [C1] 优化 C1FlexGrid 单元格边框
一 优化理由 如下图所示,如果按照 C1FlexGrid 自带的单元格边框设置,即对每个单元格的 CellStyle 的 BorderThickness 进行设置,会得到如下图的效果: 其中,明显可 ...
- C1FlexGrid小结(转自http://www.cnblogs.com/C1SupportTeam/archive/2012/12/11/2812316.html)
C1FlexGrid控件来对一个表格格式中的数据进行显示,编辑,组和总结.该表格可以绑定到一个数据源,它可以对自己的数据进行管理. C1FlexGrid控件有一个包含以下元素的丰富的对象模型: 以下的 ...
- C#++c1FlexGrid+帮助文档09
摘自: http://3y.uu456.com/bp-e2746s16s2d380eb62946d27-1.html C#:c1FlexGrid帮助文档:Value-MappedLists(值映射列表 ...
- Javascript和jquery事件--滚动条事件和自定义滚动条事件样式
很想把滚动条事件跟鼠标滚轮事件放在一起,那就直接写在这一篇了.除了事件以外,对滚动条样式的调整也记在这里吧. 滚动条是浏览器的默认事件,使用overflow:auto/scroll都有可能出现,它的默 ...
- 消除ComponentOne(C1StudioNet_2013v2) 的注册提示
以后大家如果遇到还有提示,在License文件里添加:C1.Win.C1Command.C1OutBar, C1.Win.C1Command.4, Version=4.0.20132.19568, ...
- c# WinForm 编程总结
1.清空DataGridView /// <summary> /// 清空DataGridView /// </summary> /// <param name=&quo ...
- c# 简单的通用基础字典
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Alif.Ali ...
- UVA196-Spreadsheet(拓扑排序)
Spreadsheet In 1979, Dan Bricklin and Bob Frankston wrote VisiCalc, the first spreadsheet applicatio ...
随机推荐
- 《LoadRunner12七天速成宝典》来了
看到自己的新书又要发行了,算算从09年第一本书开始,不知不觉已经是第四本书了(帮朋友合写的书不算),每次写完之后都会说太累了,不想再写了,但是却又次次反悔,吞下食言的苦果.如果非要说第四本书的感受,那 ...
- C# 自定义控件VS用户控件
1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...
- iOS开发 适配iOS10
2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从Notificat ...
- echo命令
linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的 ...
- mysql 外键约束备注
梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...
- 页面与ViewModel(上)
在UWP淘宝与旺信中,笔者主要负责页面与控件的制作,这些工作看似简单,但要想做的全面细致仍然需要深入的思考.本文想分享一些在UWP旺信的制作过程中,笔者在UI页面与控件制作上体会到的一些心得.可能笔者 ...
- MySQL8:连接查询
连接查询 连接是关系型数据库模型的主要特点. 连接查询是关系型数据库中最主要的查询,主要包括内连接.外连接等通过联结运算符可以实现多个表查询. 在关系型数据库管理系统中,表建立时各种数据之间的关系不必 ...
- 微信硬件H5面板开发(二) ---- 实现一个灯的控制
在第一节中讲解了openApi的调用,这一篇讲一下如何实现一个灯的控制.就用微信提供的lamp例子来做,将代码扒下来(实在是没办法,没有示例),整合到自己的项目中.lamp源码:http://file ...
- 谈谈 Lock
上来先看MSDN关于lock的叙述: lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. 下面的示例包含一个 lock 语句. lock 关键字可确保当一 ...
- 利用log4j+mongodb实现分布式系统中日志统一管理
背景 在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数 ...