代码之家  ›  专栏  ›  技术社区  ›  Wojciech Kulik

阻止在单击超链接时显示详细信息

  •  3
  • Wojciech Kulik  · 技术社区  · 13 年前

    我想知道当有人点击单元格内的超链接或按钮时,如何防止在DataGrid中显示详细信息行。当你试图点击超链接时,显示的是详细信息而不是链接,这真的很烦人。

    另一个问题是,我在一列中有一些操作按钮,所以当详细信息被折叠时,您必须首先单击行以显示详细信息,然后单击例如编辑按钮。

    样品:

    主窗口.xaml.cs

    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");
            }
        }
    }
    

    主窗口.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>
    

    要查看问题,请选择第一行,然后尝试单击第二行中的超链接。

    1 回复  |  直到 13 年前
        1
  •  2
  •   Shrinand    13 年前

    您可以在超链接上处理隧道事件“ 预览鼠标向下 ”,这将阻止事件到达显示RowDetailsTemplate的DataGrid。

     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; }
        }
    }