【问题标题】:How to get ToolTip from WPF Data Grid Column Header (DataGridTemplateColumn) in code?如何在代码中从 WPF 数据网格列标题 (DataGridTemplateColumn) 获取工具提示?
【发布时间】: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:你确定这可以用于数据网格列吗?这家伙声称他们不是视觉树的一部分:stackoverflow.com/questions/7660967/…
  • 这个答案是关于可视化树中数据上下文的范围以及与之相关的问题。根据您上面的代码,您没有使用 Databinding 作为标题,因此请编辑您的问题以更好地反映您的问题以及您当前的方法是什么。

标签: c# .net wpf datagrid datagridviewcolumn


【解决方案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());
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2011-04-10
    • 2011-11-21
    • 2010-10-04
    相关资源
    最近更新 更多