【问题标题】:Prevent showing details when hyperlink is clicked单击超链接时防止显示详细信息
【发布时间】:2013-02-11 22:55:47
【问题描述】:

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

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

示例:

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

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>

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

【问题讨论】:

  • 如果您需要更好的帮助,请更快;始终提供代码:)
  • 没有必要在问题标题中添加“How to”或“datagrid”,因为“how to”是多余的,因为它已经在标签中.
  • 朋友,你得到这个问题的答案的可能性很小。提供一些代码和你尝试过的一些东西。
  • 好的,我会准备一些代码 :-),但我认为对于已经使用过 DataGrid 和详细信息行的人来说这个问题很简单 :-)。
  • 我已经添加了一些代码。

标签: c# wpf datagrid hyperlink


【解决方案1】:

您可以在超链接“OnPreviewMouseDown”上处理隧道事件,这将阻止事件到达显示 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; }
    }
}

【讨论】:

  • 谢谢,这正是我需要的:-)。
  • 请查看上面代码示例中更新的事件处理程序^
猜你喜欢
  • 2019-11-09
  • 2017-06-08
  • 2018-10-25
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多