C# 禁止在单击超链接时显示详细信息
我想知道当有人单击单元格内的超链接或按钮时,如何防止在DataGrid中显示详细信息行。当你试图点击超链接并显示详细信息而不是链接时,这真的很烦人 另一个问题是,我在一列中有一些操作按钮,所以当详细信息被折叠时,您必须首先单击行以显示详细信息,然后单击例如编辑按钮 样本: MainWindow.xaml.csC# 禁止在单击超链接时显示详细信息,c#,wpf,datagrid,hyperlink,C#,Wpf,Datagrid,Hyperlink,我想知道当有人单击单元格内的超链接或按钮时,如何防止在DataGrid中显示详细信息行。当你试图点击超链接并显示详细信息而不是链接时,这真的很烦人 另一个问题是,我在一列中有一些操作按钮,所以当详细信息被折叠时,您必须首先单击行以显示详细信息,然后单击例如编辑按钮 样本: MainWindow.xaml.cs namespace WpfApplication1 { public class Item { public string Column0 { get; s
namespace WpfApplication1
{
public class Item
{
public string Column0 { get; set; }
public string Mail { get; set; }
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
public ObservableCollection<Item> Items
{
get
{
ObservableCollection<Item> i = new ObservableCollection<Item>();
i.Add(new Item() { Column0 = "dsaads", Mail = "mail@sad.com" });
i.Add(new Item() { Column0 = "wdads", Mail = "adsdas@sad.com" });
return i;
}
}
public void HyperlinkClick(object sender, RoutedEventArgs e)
{
MessageBox.Show("Clicked");
}
}
}
命名空间WpfApplication1
{
公共类项目
{
公共字符串列0{get;set;}
公共字符串邮件{get;set;}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
DataContext=this;
}
公共可观测收集项目
{
得到
{
ObservableCollection i=新的ObservableCollection();
i、 添加(新项(){Column0=“dsaads”,邮件=”mail@sad.com" });
i、 添加(新项目(){Column0=“wdads”,邮件=”adsdas@sad.com" });
返回i;
}
}
public void Hyperlink单击(对象发送者,RoutedEventArgs e)
{
MessageBox.Show(“单击”);
}
}
}
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid RowDetailsVisibilityMode="VisibleWhenSelected" ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Column0" Binding="{Binding Column0}" />
<DataGridHyperlinkColumn Header="Mail" Width="*" Binding="{Binding Mail}" >
<DataGridHyperlinkColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="Padding" Value="2,0,2,0" />
<EventSetter Event="Hyperlink.Click" Handler="HyperlinkClick" />
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Grid Height="100">
</Grid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
</Window>
要查看问题:请选择第一行,然后尝试单击第二行中的超链接。您可以在超链接“OnPreviewMouseDown”上处理隧道事件,这将阻止事件到达显示RowDetailsTemplate的数据网格
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var hyperlink = (Hyperlink)sender;
Process.Start(hyperlink.NavigateUri.AbsoluteUri);
e.Handled = true;
}
完整示例:
<Window x:Class="DummyTree.DataGridTest" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DataGridTest" Height="300" Width="300">
<Grid>
<DataGrid ItemsSource="{Binding Customers}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="First Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<Hyperlink PreviewMouseDown="OnPreviewMouseDown" NavigateUri="http://www.google.com">
<TextBlock Text="{Binding Name}" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<TextBlock Text=" details here" />
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
</Window>
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;
namespace DummyTree
{
public partial class DataGridTest : Window
{
public DataGridTest()
{
DataContext = new CustomerVM();
InitializeComponent();
}
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var hyperlink = (Hyperlink)sender;
Process.Start(hyperlink.NavigateUri.AbsoluteUri);
e.Handled = true;
}
}
public class CustomerVM
{
public ObservableCollection<Customer> Customers { get; set; }
public CustomerVM()
{
Customers = new ObservableCollection<Customer> { new Customer { Name = "Leo" }, new Customer { Name = "Om" } };
}
}
public class Customer
{
public string Name { get; set; }
}
}
代码隐藏:
<Window x:Class="DummyTree.DataGridTest" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DataGridTest" Height="300" Width="300">
<Grid>
<DataGrid ItemsSource="{Binding Customers}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="First Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock>
<Hyperlink PreviewMouseDown="OnPreviewMouseDown" NavigateUri="http://www.google.com">
<TextBlock Text="{Binding Name}" />
</Hyperlink>
</TextBlock>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<TextBlock Text=" details here" />
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
</Window>
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;
namespace DummyTree
{
public partial class DataGridTest : Window
{
public DataGridTest()
{
DataContext = new CustomerVM();
InitializeComponent();
}
private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
var hyperlink = (Hyperlink)sender;
Process.Start(hyperlink.NavigateUri.AbsoluteUri);
e.Handled = true;
}
}
public class CustomerVM
{
public ObservableCollection<Customer> Customers { get; set; }
public CustomerVM()
{
Customers = new ObservableCollection<Customer> { new Customer { Name = "Leo" }, new Customer { Name = "Om" } };
}
}
public class Customer
{
public string Name { get; set; }
}
}
使用System.Collections.ObjectModel;
使用System.Windows;
使用System.Windows.Input;
名称空间DummyTree
{
公共部分类DataGridTest:窗口
{
公共DataGridTest()
{
DataContext=newcustomervm();
初始化组件();
}
私有void OnPreviewMouseDown(对象发送器,鼠标按钮ventargs e)
{
var hyperlink=(hyperlink)发送方;
Process.Start(hyperlink.NavigateUri.AbsoluteUri);
e、 已处理=正确;
}
}
公共类CustomerVM
{
公共ObservableCollection客户{get;set;}
公共客户服务
{
Customers=newobservecollection{newcustomer{Name=“Leo”},newcustomer{Name=“Om”};
}
}
公共类客户
{
公共字符串名称{get;set;}
}
}
如果您需要更好的帮助,请更快;始终提供代码:)没有必要在问题标题中添加“How to”或“datagrid”,因为“How to”是多余的,因为暗示,“datagrid”是多余的,因为它已经在标签中了。朋友,你得到这个问题答案的机会很小。提供一些代码和一些您尝试过的东西。好的,我将准备一些代码:-),但我认为对于已经使用DataGrid和details行:-)的人来说,问题很简单。我添加了一些代码。谢谢,这就是我需要的:-)。请查看上面代码示例中更新的事件处理程序^