Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager)

Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager),第1张

概述最开始的情况: 希望的效果: 方法1:我修改了DataGrid的样式,是可以达到目的,不过要配好外面的DataPager来确定位置,如果DataPager的宽度改变了,那么就需要手动再去修改Style里滚动条位置(不过一般情况也不会去修改~)。 方法2:在外面创建一个ScrollBar然后通过这个滚动条来控制表格的滚动。 想到了绑定,不过直接在DataGrid的属性里貌似找不到他的滚动条。搜到个函

最开始的情况:


希望的效果:


方法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)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1070521.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存