综合应用WPF/WCF/WF/LINQ之二十:ListView控件中几个常用的扩展方法

本文介绍了在.NET中对ListView控件使用扩展方法的技术,包括获取当前选中项及在模板列中查找控件的方法。通过这些扩展方法,可以更方便地操作ListView控件。
 扩展方法是.NET 3.0中的一个技术亮点,它允许我们对一些对象的方法进行自定义的扩展。这样一来,我们可以将对函数的调用写成类似于object.ToString()这样的方法的调用。
  下面将介绍对ListView控件的几个扩展方法。
  1、GetItem和IsInRow。
  GetItem和IsInRow是两个类似的方法,前者用于取出当前鼠标当前选中的行,后者用于判断当前鼠标是否在行中。它的实现是基于VisualTreeHelper.HitTest方法的。
    1          public  static  bool IsInRow( this  ListView control)
    2         {
    3              try
    4             {
    5                  bool value =  true;
    6 
    7                  HitTestResult result =  VisualTreeHelper.HitTest(control,  Mouse.GetPosition(control));
    8                  object context = (result.VisualHit  as  FrameworkElement).DataContext;
    9 
   10                  if (context  is  object[]) value =  false;
   11 
   12                  return value;
   13             }
   14              catch
   15             {
   16                  throw;
   17             }
   18         }
   19 
   20          public  static  object GetItem( this  ListView control)
   21         {
   22              try
   23             {
   24                  object item =  null;
   25 
   26                  HitTestResult result =  VisualTreeHelper.HitTest(control,  Mouse.GetPosition(control));
   27                  object context = (result.VisualHit  as  FrameworkElement).DataContext;
   28 
   29                  if ((context  is  object[]) ==  false) item = context;
   30 
   31                  return item;
   32             }
   33              catch
   34             {
   35                  throw;
   36             }
   37         }
  2、GetControl和GetPresenter。
  为了能找到模板列中的控件,我们首先采用递归循环的方法(GetPresenter)来找到容纳该控件的容器,然后再找到该控件(GetControl)。它的实现是基于VisualTreeHelper.GetChild方法和ContentTemplate.FindName方法的。
    1          public  static  Control GetControl( this  ListView control,  string name)
    2         {
    3              try
    4             {
    5                  object item = control.GetItem();
    6                  ContentPresenter presenter = control.ItemContainerGenerator.ContainerFromItem(item).GetPresenter(name);
    7 
    8                  return ( Control)presenter.ContentTemplate.FindName(name, presenter);
    9             }
   10              catch
   11             {
   12                  throw;
   13             }
   14         }
    1          public  static  ContentPresenter GetPresenter( this  DependencyObject reference,  string name)
    2         {
    3              try
    4             {
    5                  for ( int i = 0; i <  VisualTreeHelper.GetChildrenCount(reference); i++)
    6                 {
    7                      DependencyObject child =  VisualTreeHelper.GetChild(reference, i);
    8 
    9                      if (child !=  null && child  is  ContentPresenter)
   10                     {
   11                          ContentPresenter presenter = child  as  ContentPresenter;
   12 
   13                          object element = presenter.ContentTemplate.FindName(name, presenter);
   14 
   15                          if (element !=  nullreturn presenter;
   16                     }
   17                      else
   18                     {
   19                          ContentPresenter presenter = child.GetPresenter(name);
   20 
   21                          if (presenter !=  nullreturn presenter;
   22                     }
   23                 }
   24 
   25                  return  null;
   26             }
   27              catch
   28             {
   29                  throw;
   30             }




本文转自 Eallies 51CTO博客,原文链接:http://blog.51cto.com/eallies/79022,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值