如何在代码中从 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将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) 获取工具提示?的主要内容,如果未能解决你的问题,请参考以下文章