一  场景介绍

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. 6. ModelDriven拦截器、Preparable 拦截器

    1. 问题 Struts2 的 Action 我们将它定义为一个控制器,但是由于在 Action 中也可以来编写一些业务逻辑,也有人会在 Action 输入业务逻辑层. 但是在企业开发中,我们一般会将 ...

  2. 用原生js做单页应用

    最近在公司接到一个需求,里面有一个三级跳转.类似于选择地址的时候,选择的顺序是:省份->市->区.如果分三个页面跳转,那么体验非常不好,如果引入其他框架做成单页应用,又比较麻烦.所以可以用 ...

  3. MyBatis基础入门--知识点总结

    对原生态jdbc程序的问题总结 下面是一个传统的jdbc连接oracle数据库的标准代码: public static void main(String[] args) throws Exceptio ...

  4. [原] KVM 虚拟化原理探究 —— 目录

    KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...

  5. Tableau未必最佳,国内BI也能突破重围!

    如今,百度一下商业智能或BI工具,总能看到Tableau的身影.并不是Tableau的营销做得好,而是国内对于商业智能工具的认知和选择似乎都落在了Tableau身上.导致不管业内业外都对商业智能的概念 ...

  6. css实现文本框和下拉框结合的案例

    html 代码部分 <div id="list-name-input" class="list-name-input"> <select ty ...

  7. 搭建TFS 2015 Build Agent环境(一)

    Download the build agent Downloading the build agent is really simple. Navigate to your TFS control ...

  8. Xamarin.Android之Fragment Walkthrough

    利用Fragment设计能够兼容不同屏幕的应用 这里我们先围观下最后的成果图,给读者打打气: 普通手机上显示的结果: 在平板上显示的结果: 笔者要郑重声明下,虽然看似是两种不同的显示效果,但是同一个应 ...

  9. CentOS 7 上部署Mono 4 和Jexus 5.6

    概述 在这篇文章中我们将讨论如何在CentOS 7操作系统,安装 jexus. mono 和 配置 jexus,因此它将能够在这种环境中运行一个asp.net mvc 4 应用.这篇文章是描述如何在 ...

  10. 【道德经】漫谈实体、对象、DTO及AutoMapper的使用

    写在前面 实体和值对象 实体和对象 故常无欲以观其妙,常有欲以观其徼 初始实体和演化实体 代码中的DTO AutoMapper实体转换 后记 实体(Entity).对象(Object).DTO(Dat ...