silverlight DataGrid 模拟实现双击行事件

it2022-05-09  40

首先看一下效果:

   

  环境:silverlight 4 ,vs2010, windows xp

  xaml:

< sdk:DataGrid AutoGenerateColumns= "False"  Height= "164"  LoadingRow= "ResultsGrid_LoadingRow"   IsReadOnly= "True"  HorizontalAlignment= "Left"  Margin= "69,70,0,0"  Name= "dataGrid1"  VerticalAlignment= "Top"  Width= "205">             < sdk:DataGrid.Columns>                 < sdk:DataGridTextColumn Header= "名称"  Width= "80"  Binding= "{Binding Name}" />                 < sdk:DataGridTextColumn Header= "年龄"  Width= "80"  Binding= "{Binding Age}" />             < /sdk:DataGrid.Columns>         < /sdk:DataGrid>

  cs:

  定义一个变量 MouseClickManager 类在后面给出

private readonly MouseClickManager _gridClickManager; 

  在构造函数中添加响应事件

 _gridClickManager = new MouseClickManager(dataGrid1, 300);      _gridClickManager.DoubleClick += new System.Windows.Input.MouseButtonEventHandler(_gridClickManager_DoubleClick); 

  对应事件 :

   private  void _gridClickManager_DoubleClick( object sender, MouseButtonEventArgs e)         {             DataGridSouceClass sc = (DataGridSouceClass)dataGrid1.SelectedItem;             MessageBox.Show( "姓名:"+sc.Name+ ",年龄:"+sc.Age);         }          private  void ResultsGrid_LoadingRow( object sender, DataGridRowEventArgs e)         {             e.Row.MouseLeftButtonUp += _gridClickManager.HandleClick;         }  

  给DataGrid绑定数据:

  定义一个类:

      public  class DataGridSouceClass           {                  public  string Name {  getset; }                  public  int Age {  getset; }           }  

  添加数据:

  List<DataGridSouceClass> ls = new List<DataGridSouceClass>();            DataGridSouceClass dc = new DataGridSouceClass();            dc.Age = 12;            dc.Name = "阿斌";            ls.Add(dc);            dataGrid1.ItemsSource = ls;

  运行基本ok !

  MouseClickManager 类,是网上的人写的。具体是那点看到的,我不记得地址了,实在抱歉。

using System;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Ink;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using System.Threading;namespace Elite.Silverlight{    public class MouseClickManager    {        public event MouseButtonEventHandler Click;        public event MouseButtonEventHandler DoubleClick;        /// <summary>        /// Gets or sets a value indicating whether this <see cref="MouseClickManager"/> is clicked.        /// </summary>        /// <value><c>true</c> if clicked; otherwise, <c>false</c>.</value>        private bool Clicked { getset; }         /// <summary>        /// Gets or sets the control.        /// </summary>        /// <value>The control.</value>        public Control Control { getset; }        /// <summary>        /// Gets or sets the timeout.        /// </summary>        /// <value>The timeout.</value>        public int Timeout { getset; }        /// <summary>        /// Initializes a new instance of the <see cref="MouseClickManager"/> class.        /// </summary>        /// <param name="control">The control.</param>        public MouseClickManager(Control control, int timeout)        {            this.Clicked = false;            this.Control = control;            this.Timeout = timeout;        }        /// <summary>        /// Handles the click.        /// </summary>        /// <param name="sender">The sender.</param>        /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>        public void HandleClick(object sender, MouseButtonEventArgs e)        {            lock(this)            {                if (this.Clicked)                {                    this.Clicked = false;                    OnDoubleClick(sender, e);                }                else                {                    this.Clicked = true;                    ParameterizedThreadStart threadStart = new ParameterizedThreadStart(ResetThread);                    Thread thread = new Thread(threadStart);                    thread.Start(e);                }            }        }        /// <summary>        /// Resets the thread.        /// </summary>        /// <param name="state">The state.</param>        private void ResetThread(object state)        {            Thread.Sleep(this.Timeout);            lock (this)            {                if (this.Clicked)                {                    this.Clicked = false;                    OnClick(this, (MouseButtonEventArgs)state);                }            }        }        /// <summary>        /// Called when [click].        /// </summary>        /// <param name="sender">The sender.</param>        /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>        private void OnClick(object sender, MouseButtonEventArgs e)        {            MouseButtonEventHandler handler = Click;            if (handler != null)                this.Control.Dispatcher.BeginInvoke(handler, sender, e);        }        /// <summary>        /// Called when [double click].        /// </summary>        /// <param name="sender">The sender.</param>        /// <param name="e">The <see cref="System.Windows.Input.MouseButtonEventArgs"/> instance containing the event data.</param>        private void OnDoubleClick(object sender, MouseButtonEventArgs e)        {            MouseButtonEventHandler handler = DoubleClick;            if (handler != null)                handler(sender, e);        }    }}本文来自真的还可以吧的博客,原文地址:http://hi.baidu.com/

转载请注明原文地址: https://win8.8miu.com/read-1489390.html

最新回复(0)