我们知道wpf中的DataGrid控件是没有鼠标单击事件的,使用MouseDown事件比较弱,要先鼠标单击一下,选中某个单元格,再鼠标单击才响应事件,这不是我们想要的

要响应鼠标单击事件的列,我们采用DataGridHyperlinkColumn超链接控件进行代替

下面提供3种解决方案:

方案一:最原始的方法,直接在xaml中写死,缺点是不灵活

方案二:可以动态的设置DataGridHyperlinkColumn显示和不显示(并且不显示时不占位置),灵活性很大,可以通过一个bool值进行显示或者不显示控制

方案三:代码动态创建DataGridHyperlinkColumn对象,并动态套上关联事件(利用Window.Resources),灵活性更大

方案四: 纯代码方式创建DataGridHyperlinkColumn对象,并纯代码的方式创建事件(推荐,满足当前工作的需求)

由于本人并没有系统地学过wpf,术语上如有写得不对的地方请多多指正!

方案一:

下面只贴出DataGrid对应的xaml代码,如下:

<Grid ><DataGrid AutoGenerateColumns="False" Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" HeadersVisibility="None" Background="{x:Null}" Foreground="#FF3939EB" ><DataGrid.Columns ><DataGridHyperlinkColumn Header="新冠问卷" Width="479" Binding="{Binding Path=FullFileName}"><DataGridHyperlinkColumn.ElementStyle><Style   TargetType="TextBlock"><Setter Property="VerticalAlignment" Value="Center"></Setter><EventSetter Event="Hyperlink.Click" HandledEventsToo="False" Handler="OnHyperlinkClick" ></EventSetter></Style></DataGridHyperlinkColumn.ElementStyle></DataGridHyperlinkColumn></DataGrid.Columns></DataGrid></Grid>

xaml对应的C#代码如下:

   public partial class MainWindow : Window{DataTable dt = new DataTable();DataColumn col = new DataColumn("FullFileName", typeof(string));dt.Columns.Add(col);DataRow dr = dt.NewRow();dr[0] = "超链接1";dt.Rows.Add(dr);DataRow dr2 = dt.NewRow();dr2[0] = "超链接2";dt.Rows.Add(dr2);DataRow dr3 = dt.NewRow();dr3[0] = "超链接3";dt.Rows.Add(dr3);dataGrid1.ItemsSource = dt.DefaultView;}//对应的鼠标单击事件private void OnHyperlinkClick(object sender, RoutedEventArgs e){if (dataGrid1.SelectedItem == null){return;}MessageBox.Show((dataGrid1.SelectedValue as DataRowView)[0].ToString());}}

最终的效果图如下:

方案二:

在方案一的DataGridHyperlinkColumn标签上加上Name属性和Visibility(默认让它不显示),xaml代码如下:

 <Grid ><DataGrid AutoGenerateColumns="False" Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" HeadersVisibility="None" Background="{x:Null}" Foreground="#FF3939EB" ><DataGrid.Columns ><DataGridHyperlinkColumn  x:Name="ColumnName1" Visibility="Collapsed" Header="新冠问卷" Width="479"  Binding="{Binding Path=FullFileName}"><DataGridHyperlinkColumn.ElementStyle><Style   TargetType="TextBlock"><Setter Property="VerticalAlignment" Value="Center"></Setter><EventSetter Event="Hyperlink.Click" HandledEventsToo="False" Handler="OnHyperlinkClick" ></EventSetter></Style></DataGridHyperlinkColumn.ElementStyle></DataGridHyperlinkColumn></DataGrid.Columns></DataGrid>

从上面的DataGridHyperlinkColumn标签,我们可见,新增了 x:Name="ColumnName1" 属性和Visibility="Collapsed"属性

xaml对应的后台代码:

 public partial class MainWindow : Window{public MainWindow(){InitializeComponent();DataTable dt = new DataTable();DataColumn col = new DataColumn("FullFileName", typeof(string));dt.Columns.Add(col);DataRow dr = dt.NewRow();dr[0] = "超链接1";dt.Rows.Add(dr);DataRow dr2 = dt.NewRow();dr2[0] = "超链接2";dt.Rows.Add(dr2);DataRow dr3 = dt.NewRow();dr3[0] = "超链接3";dt.Rows.Add(dr3);dataGrid1.ItemsSource = dt.DefaultView;this.ColumnName1.Visibility = Visibility.Visible;}private void OnHyperlinkClick(object sender, RoutedEventArgs e){if (dataGrid1.SelectedItem == null){return;}MessageBox.Show((dataGrid1.SelectedValue as DataRowView)[0].ToString());}}

最终效果图就不贴出来了,和方案1  一样

方案三

利用Resources资源对样式进行管理,这样就可以动态为DataGrid添加一列和套上处理事件

xaml代码如下:

 <Window.Resources><Style   TargetType="TextBlock" x:Name="ContentStyle1"><Setter Property="VerticalAlignment" Value="Center"></Setter><EventSetter Event="Hyperlink.Click" HandledEventsToo="False" Handler="OnHyperlinkClick" ></EventSetter></Style></Window.Resources><Grid ><DataGrid AutoGenerateColumns="False" Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" HeadersVisibility="None" Background="{x:Null}" Foreground="#FF3939EB" ></DataGrid></Grid>

从上面的xaml代码中我们可以看出,我们为<Style>样式起了个别名x:Name="ContentStyle1"

对应的后台代码如下:

 public partial class MainWindow : Window{public MainWindow(){InitializeComponent();DataGridHyperlinkColumn newColumn1 = new DataGridHyperlinkColumn(){Header = "新冠问卷1",Width = 100,Binding = new Binding("ColumnName1"),};//为新增的第一列动态套用样式newColumn1.ElementStyle = (Style)this.Resources["ContentStyle1"];this.dataGrid1.Columns.Add(newColumn1);DataGridHyperlinkColumn newColumn2 = new DataGridHyperlinkColumn(){Header = "新冠问卷2",Width = 100,Binding = new Binding("ColumnName2"),};//为新增的第二列动态套用样式newColumn2.ElementStyle = (Style)this.Resources["ContentStyle1"];this.dataGrid1.Columns.Add(newColumn2);DataTable dt = new DataTable();DataColumn column1 = new DataColumn("ColumnName1", typeof(string));DataColumn column2 = new DataColumn("ColumnName2", typeof(string));dt.Columns.Add(column1);dt.Columns.Add(column2);DataRow dr1 = dt.NewRow();dr1["ColumnName1"] = "超链接11";dr1["ColumnName2"] = "超链接12";DataRow dr2 = dt.NewRow();dr2["ColumnName1"] = "超链接21";dr2["ColumnName2"] = "超链接22";DataRow dr3 = dt.NewRow();dr3["ColumnName1"] = "超链接31";dr3["ColumnName2"] = "超链接32";dt.Rows.Add(dr1);dt.Rows.Add(dr2);dt.Rows.Add(dr3);dataGrid1.ItemsSource = dt.DefaultView;}private void OnHyperlinkClick(object sender, RoutedEventArgs e){if (dataGrid1.SelectedItem == null){return;}MessageBox.Show((e.OriginalSource as Hyperlink).NavigateUri.OriginalString);}}

最终效果图:

方案四:

xaml代码如下(注意只留了一个DataGird空壳):

<Grid ><DataGrid AutoGenerateColumns="False" Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="479" HeadersVisibility="None" Background="{x:Null}" Foreground="#FF3939EB" ></DataGrid></Grid>

xaml对应的后台代码 :

public partial class MainWindow : Window{public MainWindow(){InitializeComponent();var style = new Style(typeof(TextBlock));//为样式动态绑定事件style.Setters.Add(new EventSetter(Hyperlink.ClickEvent, (RoutedEventHandler)OnHyperlinkClick));DataGridHyperlinkColumn newColumn1 = new DataGridHyperlinkColumn(){Header = "新冠问卷1",Width = 100,Binding = new Binding("ColumnName1"),};//为新增的第一列动态套用样式newColumn1.ElementStyle = style;this.dataGrid1.Columns.Add(newColumn1);DataGridHyperlinkColumn newColumn2 = new DataGridHyperlinkColumn(){Header = "新冠问卷2",Width = 100,Binding = new Binding("ColumnName2"),};//为新增的第二列动态套用样式newColumn2.ElementStyle = style;this.dataGrid1.Columns.Add(newColumn2);DataTable dt = new DataTable();DataColumn column1 = new DataColumn("ColumnName1", typeof(string));DataColumn column2 = new DataColumn("ColumnName2", typeof(string));dt.Columns.Add(column1);dt.Columns.Add(column2);DataRow dr1 = dt.NewRow();dr1["ColumnName1"] = "超链接11";dr1["ColumnName2"] = "超链接12";DataRow dr2 = dt.NewRow();dr2["ColumnName1"] = "超链接21";dr2["ColumnName2"] = "超链接22";DataRow dr3 = dt.NewRow();dr3["ColumnName1"] = "超链接31";dr3["ColumnName2"] = "超链接32";dt.Rows.Add(dr1);dt.Rows.Add(dr2);dt.Rows.Add(dr3);dataGrid1.ItemsSource = dt.DefaultView;}private void OnHyperlinkClick(object sender, RoutedEventArgs e){if (dataGrid1.SelectedItem == null){return;}MessageBox.Show((e.OriginalSource as Hyperlink).NavigateUri.OriginalString);}}

最终效果图和方案三的效果图一样

为wpf中的DataGrid控件添加鼠标单击事件相关推荐

  1. qt界面中禁用某个控件的鼠标滑轮事件

    主要思想就是:当进入滑轮的滚动事件的时候,就禁用该控件,而进入鼠标点击事件的时候,就将这个控件进行激活 如:spinBox控件,鼠标的过滤事件可以参考博客:https://blog.csdn.net/ ...

  2. 在WPF中使用WinForm控件方法

    在WPF中使用WinForm控件方法 原文:在WPF中使用WinForm控件方法 1.      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,Syste ...

  3. 如何在wpf中使用winform控件或者winform的自定义控件

    前言 在wpf中使用winform控件或者winform的自定义控件 一.添加引用 WindowsFormsIntegration.dll System.Windows.Forms.dll 提示:这两 ...

  4. 在asp.net中为Web用户控件添加属性和事件

    在90年代初,Microsoft为Web程序员提供的 Active Server Pages(ASP)革命性地改变了Web的编程.它可以利用十分易用的模型在Web服务器上动态生成HTML,并且很容易的 ...

  5. android开发中为MultiAutoCompleteTextView控件添加其他分隔符

    android开发中为MultiAutoCompleteTextView控件添加其他分隔符,例如:分隔符改为分号";" zs;ls;ww;xm //SemicolonTokeniz ...

  6. 如何在WPF中使用Winform控件

    要在WPF中使用WInform组件,必须将WInform组件放在宿主WindowsFormsHost中. WindowsFormsHost是WPF的一个控件,它允许在WPF应用程序中托管Windows ...

  7. asp.net中显示DataGrid控件列序号的几种方法

    在aps.net中多数据绑定的控件很多,论功能来说,应该属DataGrid最为齐全,但它没有提供现成的显示记录序号的功能,不过我们可以通过它所带的一些参数来间接得到序号,下面来看看怎样得到和显示序号值 ...

  8. 为.net中的ListBox控件添加双击事件

    我在用dotnet做一个项目的过程中,遇到了一个ListBox的问题:通过在一个ListBox中双击,把选中的项添加到另一个ListBox中,但ListBox控件本身并没有该事件,那么如何实现呢?我就 ...

  9. 金蝶EAS DEP脚本(5)给常用控件添加值改变事件

    给常用控件添加事件 一.F7 给F7添加值改变事件 //F7控件增加值改变监听 pluginCtx.getKDBizPromptBox("prmtCompany").addData ...

  10. 关于从页面中获取用户控件中的其它控件(如DropDownList)事件的方法

    在项目中经常把一些经常使用的代码做成用户控件以提高代码的可重用性, 一个经常遇到的就是在页面中调用用户控件中的服务器控件的事件,下面给出简单的代码示列. 我们在一个用户控件(MaterialRepor ...

最新文章

  1. oracle 回闪技术恢复误删数据
  2. 整数的无符号编码和有符号编码
  3. C/C++中涉及存储方式的关键字:auto,static,register,extern2009-01-22 11:23auto关键字:
  4. idea配置tomcat的方法
  5. 字符串与指针,数组的关系与用途
  6. iOS开发——MBProgressHUD 与 SVProgressHUD iOS提示框的优缺点
  7. SpringBoot:application.properties基本的参数配置
  8. 中职学校计算机教学背景,创新网络背景下中职院校计算机教学模式探析
  9. 【区块链】以太坊truffle+web3+ganache简单实践
  10. MySQL 5.7.27详细下载安装配置教程
  11. linux金山打字通游戏版,金山打字游戏2010电脑版-金山打字游戏(最全大集合安装)下载V8.1.0.1官方版-西西软件下载...
  12. 上传应用到苹果一直卡住验证中(authentication with the app store)问题解决
  13. Mac系统常用软件总结
  14. 统计学计算机数据输入,数据输入是什么意思
  15. 03 graphx 从 SSSP 来看 pregel
  16. Java版数据结构之数组模拟环形队列demo
  17. WeChat 聊天记录从一台手机转移到另外一台手机的注意事项
  18. Java - 加号(+)的作用
  19. UI框架(UGUI)
  20. RSA非对称加密传输---前端加密解密(VUE项目)

热门文章

  1. 生存分析-Cox回归模型
  2. 综合评价模型的缺点_城市黑臭水体:污染现状、成因、评价方法、治理技术与对策...
  3. ecs 导出mysql文件_mysql导出数据库文件
  4. TikTok二面:“聊聊二维码扫码登录的原理”。
  5. TikTok二面: 说下二维码登录的原理?
  6. ffmpeg 命令行多视频轨/音频轨合并,播放
  7. html转邮件html格式转换,如何把电子邮件格式改成HTML格式
  8. html中电子邮件地址怎么写,电子邮件地址怎么写
  9. H5标签 marquee 滚动字幕
  10. ubuntu 16.04安装中文输入法