silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_262_0@

概述

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

最开始的情况:

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


希望的效果

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;
        }
    }

前台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 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的滚动条。


Demo下载地址:点击打开链接

大佬总结

以上是大佬教程为你收集整理的Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager)全部内容,希望文章能够帮你解决Sliverlight,为DataGrid添加外置的滚动条(ScrollBar)和分页(DataPager)所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。