Silverlight学习笔记二(续)

上篇中在设置排序标志的时候,需要不停的去刷新,这样做肯定是不行的,所以必须要找到其它的方式。

看了一下关于自定义ColumnHeader的内容,在2.0的测试版本中,可以直接设置Column.Header为某个自定义的控件,但是在正式版中,这个功能被取消了,必须要通过Column.HeaderStyle来设置,动态设置Style还是比较费事的,暂时还没有做好。

所以想了个折中的办法,就是在Header上面手工加上"↑"和"↓"来标示排序的方向。

所要做的就是在MouseDown中修改一下Header.Content

代码如下:

   

 1  private   void  dgData_MouseLeftButtonDown( object  sender, MouseButtonEventArgs e)
 2          {
 3              var u  =  from element  in  VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition( null ), dgData)
 4                       where  element  is  DataGridColumnHeader
 5                      select element;
 6 
 7               if  (u.Count()  ==   1 )
 8              {
 9                   // 鼠标点击的ColumnHeader
10                  DataGridColumnHeader header  =  (DataGridColumnHeader)u.Single();
11                   // 要排序的字段
12                   string  _newsort  =  header.Content.ToString();
13                   // 清除名称中的↑和↓
14                  _newsort  =  removeSortStateFlag(_newsort);
15                   // 判断排序方向
16                   if  (_newsort  ==  sortFiled)
17                      dir  =  dir  ==   " desc "   ?   " asc "  :  " desc " ;
18                   else
19                  {
20                       // 如果新的排序字段和当前的排序字段不一样,则要清楚当前排序字段的排序标志(↑↓)
21                       if  (sortHeader != null )
22                          sortHeader.Content  =  removeSortStateFlag(sortHeader.Content.ToString());
23                      dir  =   " asc " ;
24                  }
25                  sortFiled  =  _newsort;
26                   // 加上排序标志
27                  header.Content  =  dir  ==   " asc "   ?  _newsort  +   "  ↑ "  : _newsort  +   "  ↓ " ;
28                   // 设置新的排序字段为当前排序字段
29                  sortHeader  =  header;
30                  BindGrid();
31                  e.Handled  =   true ;
32              }
33               else
34                  e.Handled  =   false ;
35          }

完整的代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
  1     public partial class ProductsList : UserControl
  2     {
  3         private List<Products> products_list;
  4         private Pager pager = null;
  5         //当前排序的字段
  6         private string sortFiled = "ProductID";
  7         //当前排序的方向
  8         private string dir = "asc";
  9         //当前排序的ColumnHeader
 10         private DataGridColumnHeader sortHeader;
 11 
 12         public ProductsList()
 13         {
 14             InitializeComponent();
 15             MouseHelper.SetMouseWheelHandler(OnMouseWheel);
 16             BindGrid();
 17         }
 18 
 19         private void BindGrid()
 20         {
 21             canvas.Visibility = Visibility.Visible;
 22             var client = new NorthWindWCF.NorthWindWCFClient();
 23             client.GetProductsPagingCompleted += new EventHandler<GetProductsPagingCompletedEventArgs>(client_GetProductsPagingCompleted);
 24             int start = 1;
 25             int limit = 10;
 26             if (pager != null)
 27                 start = (pager.PageIndex - 1* 10 + 1;
 28             client.GetProductsPagingAsync(start, limit, sortFiled, dir);
 29         }
 30 
 31         public void OnMouseWheel(object sender, MouseWheelHandlerEventArgs args)
 32         {
 33             if (Parent == nullreturn;
 34             sv.ScrollToVerticalOffset(sv.VerticalOffset - args.Delta * 15);
 35         }
 36 
 37         private void client_GetProductsPagingCompleted(object sender, GetProductsPagingCompletedEventArgs e)
 38         {
 39             if (e.Error == null)
 40             {
 41                 products_list = e.Result.ToList();
 42                 dgData.ItemsSource = products_list;
 43                 if (pager == null)
 44                 {
 45                     pager = new Pager(e.TotalPage, 2);
 46                     pager.Click += new Pager.PagerButtonClick(pager_Click);
 47                     pager.PageIndex = 1;
 48                     spPager.Children.Clear();
 49                     spPager.Children.Add(pager);
 50                 }
 51             }
 52             else
 53                 MessageBox.Show(e.Error.Message);
 54             canvas.Visibility = Visibility.Collapsed;
 55         }
 56 
 57         private void pager_Click(object sender, RoutedEventArgs e)
 58         {
 59             BindGrid();
 60         }
 61 
 62         private void dgData_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
 63         {
 64             var u = from element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), dgData)
 65                     where element is DataGridColumnHeader
 66                     select element;
 67 
 68             if (u.Count() == 1)
 69             {
 70                 //鼠标点击的ColumnHeader
 71                 DataGridColumnHeader header = (DataGridColumnHeader)u.Single();
 72                 //要排序的字段
 73                 string _newsort = header.Content.ToString();
 74                 //清除名称中的↑和↓
 75                 _newsort = removeSortStateFlag(_newsort);
 76                 //判断排序方向
 77                 if (_newsort == sortFiled)
 78                     dir = dir == "desc" ? "asc" : "desc";
 79                 else
 80                 {
 81                     //如果新的排序字段和当前的排序字段不一样,则要清楚当前排序字段的排序标志(↑↓)
 82                     if (sortHeader != null )
 83                         sortHeader.Content = removeSortStateFlag(sortHeader.Content.ToString());
 84                     dir = "asc";
 85                 }
 86                 sortFiled = _newsort;
 87                 //加上排序标志
 88                 header.Content = dir == "asc" ? _newsort + " ↑" : _newsort + " ↓";
 89                 //设置新的排序字段为当前排序字段
 90                 sortHeader = header;
 91                 BindGrid();
 92                 e.Handled = true;
 93             }
 94             else
 95                 e.Handled = false;
 96         }
 97 
 98         private string removeSortStateFlag(string dir)
 99         {
100             int pos = dir.IndexOfAny(new char[] { '''' });
101             if (pos > 0) dir = dir.Substring(0, pos - 1);
102             return dir;
103         }
104 

 

最终效果:

转载于:https://www.cnblogs.com/libra163/archive/2008/12/26/1362805.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值