如何在代码中从 WPF 数据网格列标题 (DataGridTemplateColumn) 获取工具提示?

Posted

技术标签:

【中文标题】如何在代码中从 WPF 数据网格列标题 (DataGridTemplateColumn) 获取工具提示?【英文标题】:How to get ToolTip from WPF Data Grid Column Header (DataGridTemplateColumn) in code? 【发布时间】:2021-11-05 22:53:56 【问题描述】:

我为 DataGridTemplateColumn 设置了 Tooltip,如下所示:

<DataGridTemplateColumn.Header>
<TextBlock Text="Current" ToolTip="Price" ToolTipService.InitialShowDelay="0" ToolTipService.Placement="Top" ToolTipService.ShowDuration="999999" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
</DataGridTemplateColumn.Header>

如何在代码中获取工具提示数据?

【问题讨论】:

只需find您的文本块,您就可以访问工具提示:yourtextblockobject.ToolTip(请参阅TextBlock documentation) 谢谢我尝试过这样的事情,但它抛出异常: Utility.GetFirstVisualChild ( e.Column ); @Tanque:你确定这可以用于数据网格列吗?这家伙声称他们不是视觉树的一部分:***.com/questions/7660967/… 这个答案是关于可视化树中数据上下文的范围以及与之相关的问题。根据您上面的代码,您没有使用 Databinding 作为标题,因此请编辑您的问题以更好地反映您的问题以及您当前的方法是什么。 【参考方案1】:

TextBlock放在列的HeaderTemplate中:

<DataGridTemplateColumn x:Name="col">
    <DataGridTemplateColumn.HeaderTemplate>
        <DataTemplate>
            <TextBlock Text="Current" ToolTip="Price" ToolTipService.InitialShowDelay="0" ToolTipService.Placement="Top"
                       ToolTipService.ShowDuration="999999" RenderOptions.BitmapScalingMode="NearestNeighbor"/>
        </DataTemplate>
    </DataGridTemplateColumn.HeaderTemplate>
</DataGridTemplateColumn>

...并使用VisualTreeHelper:

找到它
private void Button_Click(object sender, RoutedEventArgs e)

    var columns = FindVisualChildren<System.Windows.Controls.Primitives.DataGridColumnHeader>(dataGrid)?
        .ToArray();

    if (columns != null)
    
        int columnIndex = 1;
        if (columns.Length > columnIndex)
        
            var textBlock = FindVisualChildren<TextBlock>(columns[columnIndex])?
            .FirstOrDefault();
            if (textBlock != null)
            
                string tooltip = textBlock.ToolTip?.ToString();
                //...
            
        
    


private static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
    
        DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
        if (child is T t)
            yield return t;

        foreach (T childOfChild in FindVisualChildren<T>(child))
            yield return childOfChild;
    

【讨论】:

非常感谢。是否可以直接传递作为 DataGridColumn 而不是循环的 e.Column?我正在根据排序事件中当前单击的列实现代码: void DataGrid_Sorting (object sender, DataGridSortingEventArgs e) 我只是不知道如何从 e.Column 获取列标题。 e.Column.Header 是对象类型。 "e.Column.Header 是对象类型" - 您是否在该对象上尝试了 GetType() 以便知道要转换该对象的内容? 您能否用该信息更新您的问题 "和 ContentControl 的 Content 属性一样,Header 可以是任何类型。" - 取自 this 文档的最后一段。所以在上述情况下可能类似于e.Column.Header as TextBlock 不要更新您的问题。如果您有其他问题,请询问新的。【参考方案2】:

我从您对@mm8 答案的评论中猜测:

private void DataGrid_Sorting( object sender, DataGridSortingEventArgs e ) 

    var myHeaderItem = e.Column.Header as TextBlock;
    Console.WriteLine(myHeaderItem?.ToolTip.ToString());

【讨论】:

以上是关于如何在代码中从 WPF 数据网格列标题 (DataGridTemplateColumn) 获取工具提示?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WPF 中更改数据网格标题样式或元素样式前景

使用 WPF 数据网格时如何更改列标题的背景颜色

对 WPF 数据网格中的多列进行排序

如何在自定义 wpf 控件上绑定数据网格列的可见性?

如何让复选框在 WPF 数据网格中工作

如何从 WPF 中网格内的标签中获取行和列信息?