最开始的情况:
希望的效果:
方法1:我修改了DataGrID的样式,是可以达到目的,不过要配好外面的DataPager来确定位置,如果DataPager的宽度改变了,那么就需要手动再去修改Style里滚动条位置(不过一般情况也不会去修改~)。
方法2:在外面创建一个Scrollbar然后通过这个滚动条来控制表格的滚动。
想到了绑定,不过直接在DataGrID的属性里貌似找不到他的滚动条。搜到个函数可以找到对象,但是在前台和后台都尝试绑定却依旧控制不了(拖动DataGrID的滚动条,外置的会跟着动),于是再搜索,终于在一个的网友的文章里找到了同样的问题,不过他写的好简略而且没有给出源代码。我来补充吧。
用于获得和同步Scroll的扩展类:
DataGrIDScrollExtensions
public static class DataGrIDScrollExtensions { /// <summary> /// 枚举,横向滚动条/纵向滚动条 /// </summary> public enum ScrollMode { Vertical,Horizontal } /// <summary> /// 把滚动条至于最前端。 /// <param name="mode"></param> public static voID ScrollToStart(this DataGrID grID,ScrollMode mode) { switch (mode) { case ScrollMode.Vertical: grID.Scrolltopercent(ScrollMode.Vertical,0); break; case ScrollMode.Horizontal: grID.Scrolltopercent(ScrollMode.Horizontal,0); break; } } /// <summary> /// 把滚动条至于最后端。 /// </summary> /// <param name="mode"></param> public static voID ScrollToEnd(this DataGrID grID,100); break; case ScrollMode.Horizontal: grID.Scrolltopercent(ScrollMode.Horizontal,100); break; } } /// <summary> /// 把滚动条至于指定位置。 /// </summary> /// <param name="mode"></param> /// <param name="percent"></param> public static voID Scrolltopercent(this DataGrID grID,ScrollMode mode,double percent) { if (percent < 0) percent = 0; else if (percent > 100) percent = 100; var scrollProvIDer = GetScrollProvIDer(grID); //滚动 switch (mode) { case ScrollMode.Vertical: scrollProvIDer.SetScrollPercent(System.windows.automation.ScrollPatternIDentifIErs.NoScroll,percent); break; case ScrollMode.Horizontal: scrollProvIDer.SetScrollPercent(percent,System.windows.automation.ScrollPatternIDentifIErs.NoScroll); break; } } /// <summary> /// 获取滚动条当前位置。 /// </summary> /// <param name="mode"></param> /// <returns></returns> public static double GetScrollposition(this DataGrID grID,ScrollMode mode) { var scrollbar = grID.GetScrollbar(mode); return scrollbar.Value; } /// <summary> /// 获取滚动条最大值。 /// </summary> /// <param name="mode"></param> /// <returns></returns> public static double GetScrollMaximum(this DataGrID grID,ScrollMode mode) { var scrollbar = grID.GetScrollbar(mode); return scrollbar.Maximum; } /// <summary> /// 设置滚动条到指定位置。 /// </summary> /// <param name="mode"></param> /// <param name="position"></param> public static voID Scroll(this DataGrID grID,double position) { var scrollbar = grID.GetScrollbar(mode); double positionPct = ((position / scrollbar.Maximum) * 100); grID.Scrolltopercent(mode,positionPct); } /// <summary> /// 获取滚动条。 /// </summary> /// <param name="element"></param> /// <returns></returns> private static IScrollProvIDer GetScrollProvIDer(DataGrID grID) { var p = FrameworkElementautomationPeer.fromElement(grID) ?? FrameworkElementautomationPeer.CreatePeerForElement(grID); return p.GetPattern(PatternInterface.Scroll) as IScrollProvIDer; } /// <summary> /// 在指定的DataGrID中指定需要找到的滚动条(横/纵)。 /// </summary> /// <param name="grID"></param> /// <param name="mode"></param> /// <returns></returns> public static Scrollbar GetScrollbar(this DataGrID grID,ScrollMode mode) { if (mode == ScrollMode.Vertical) return grID.GetScrollbar("VerticalScrollbar"); else return grID.GetScrollbar("HorizontalScrollbar"); } /// <summary> /// 在指定的DataGrID中找到他的Scroll。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="dep"></param> /// <returns></returns> private static Scrollbar GetScrollbar(this DependencyObject dep,string name) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dep); i++) { var child = VisualTreeHelper.GetChild(dep,i); if (child != null && child is Scrollbar && ((Scrollbar)child).name == name) return child as Scrollbar; else { Scrollbar sub = GetScrollbar(child,name); if (sub != null) return sub; } } return null; } }
前台Xaml:
<toolkit:DockPanel > <toolkit:DockPanel toolkit:DockPanel.Dock="Bottom" Height="26"> <sdk:DataPager x:name="dataPager" PageSize="13" WIDth="173" FontFamily="Tahoma" toolkit:DockPanel.Dock="Right"/> <Scrollbar x:name="scorllbar1" Height="24" OrIEntation="Horizontal" VIEwportSize="10"/> </toolkit:DockPanel> <sdk:DataGrID x:name="dataGrID" autoGenerateColumns="False" IsReadonly="True" AlternatingRowBackground="AntiqueWhite" Background="#FFE0DEDE" toolkit:DockPanel.Dock="top"> <sdk:DataGrID.Columns> <sdk:DataGrIDTextColumn header="机构" Binding="{Binding JG}"/> <sdk:DataGrIDTextColumn header="办理柜员" Binding="{Binding BLGY}"/> <sdk:DataGrIDTextColumn header="业务" Binding="{Binding YW}"/> <sdk:DataGrIDTextColumn header="票号" Binding="{Binding PH}"/> <sdk:DataGrIDTextColumn header="到达时间" Binding="{Binding DDSJ}"/> <sdk:DataGrIDTextColumn header="办理时间" Binding="{Binding BLSJ}"/> <sdk:DataGrIDTextColumn header="结束时间" Binding="{Binding JsSJ}"/> <sdk:DataGrIDTextColumn header="等待时长" Binding="{Binding DDSC}"/> <sdk:DataGrIDTextColumn header="服务时长" Binding="{Binding FWSC}"/> <sdk:DataGrIDTextColumn header="驻留时长" Binding="{Binding ZLSC}"/> <sdk:DataGrIDTextColumn header="业务状态" Binding="{Binding YWZT}"/> <sdk:DataGrIDTextColumn header="评价" Binding="{Binding PJ}"/> </sdk:DataGrID.Columns> </sdk:DataGrID> </toolkit:DockPanel>PS:DockPanel是属于Silverlight Toolkit的控件, 确认你安装了Silverlight Toolkit.再引用System.windows.control。
后台CS:
1、设置DataPager
PagedCollectionVIEw itemListVIEw = new PagedCollectionVIEw(new dataSourceList()); dataGrID.ItemsSource = itemListVIEw;dataPager.source = itemListVIEw;PS:dataSourceList是DateGrID的数据源,我前面有写http://blog.csdn.net/wushang923/article/details/7168820
2、设置Scrollbar
/// <summary> /// 尝试通过VistualTree来找到Scrollbar对象 /// </summary> private voID TryUseVisualTree() { EventHandler h = null; Scrollbar scroll = null; //在LayoutUpated里 *** 作能确保数据加载完成,这样下面的设置才不会出错。 dataGrID.LayoutUpdated += h = delegate { if (scroll == null) { scroll = DataGrIDScrollExtensions.GetScrollbar(dataGrID,DataGrIDScrollExtensions.ScrollMode.Horizontal); if (scroll != null) { //一旦找到注销LayoutUpdated事件 dataGrID.LayoutUpdated -= h; //隐藏原来DataGrID里的滚动条。 scroll.Opacity = 0; //设置外置滚动条最大值。 scorllbar1.Maximum = scroll.Maximum; //设置外置滚动条最小改变值。 scorllbar1.SmallChange= 20; //滚动条滚动位移量设为原有位移量的0.9倍。 scorllbar1.VIEwportSize = scroll.VIEwportSize * 0.9; //执行同步 scorllbar1.ValueChanged += new RoutedPropertyChangedEventHandler<double>(scroll_ValueChanged); } } }; } /// <summary> /// 值改变的响应函数。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> voID scroll_ValueChanged(object sender,RoutedPropertyChangedEventArgs<double> e) { this.dataGrID.Scroll(DataGrIDScrollExtensions.ScrollMode.Horizontal,e.NewValue); }PS:因为最后需要把DataGrID的滚动条隐藏起来,所以不能用scorllbar1直接获取DataGrID的滚动条。
Demo下载地址:点击打开链接
总结以上是内存溢出为你收集整理的Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager)全部内容,希望文章能够帮你解决Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)