大佬教程收集整理的这篇文章主要介绍了Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
最开始的情况:
希望的效果:
方法1:我修改了DataGrid的样式,是可以达到目的,不过要配好外面的DataPager来确定位置,如果DataPager的宽度改变了,那么就需要手动再去修改Style里滚动条位置(不过一般情况也不会去修改~)。
方法2:在外面创建一个ScrollBar然后通过这个滚动条来控制表格的滚动。
想到了绑定,不过直接在DataGrid的属性里貌似找不到他的滚动条。搜到个函数可以找到对象,但是在前台和后台都尝试绑定却依旧控制不了(拖动DataGrid的滚动条,外置的会跟着动),于是再搜索,终于在一个的网友的文章里找到了同样的问题,不过他写的好简略而且没有给出源代码。我来补充吧。
用于获得和同步Scroll的扩展类:
DataGridScrollExtensions
public static class DataGridScrollExtensions { /// <sumMary> /// 枚举,@L_772_15@条/纵向滚动条 /// </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; } }
<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 data@R_675_9016@eList()); dataGrid.Items@R_675_9016@e = itemListView; dataPager.source = itemListView;PS:data@R_675_9016@eList是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的滚动条。
以上是大佬教程为你收集整理的Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager)全部内容,希望文章能够帮你解决Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。