[英]Wpf DataGrid ToolTip for column headers
我有一個 datagrid 單元格的工具提示,當單元格內容被修剪時它會打開:
private void grid2_MouseMove(object sender, MouseEventArgs e)
{
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) &&
!(dep is DataGridCell) && !(dep is DataGrid))
{
if (dep is Run)
continue;
dep = VisualTreeHelper.GetParent(dep);
}
if (dep == null)
return;
if (dep is DataGridCell)
{
DataGridCell cell = dep as DataGridCell;
var x = cell.Content as TextBlock;
if (x.Text != check)
tlp.IsOpen = false;
if (x != null)
{
FormattedText formattedText = new FormattedText(x.Text,
System.Threading.Thread.CurrentThread.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface(x.FontFamily.ToString()),
x.FontSize,
Brushes.Black);
if (formattedText.Width > Convert.ToDouble(cell.Column.ActualWidth.ToString()) - 3)
{
tlp.Content = x.Text;
tlp.IsOpen = true;
check = x.Text;
}
}
}
if (dep is DataGrid)
if (tlp.IsOpen == true)
tlp.IsOpen = false;
}
我想對列標題做同樣的事情,但我不知道如何。 例如,沒有像“DataGridColumnHeader”這樣的對象...請幫幫我好嗎?
以下是向列標題添加工具提示的兩種方法。
<DataGrid x:Name="TheDataGrid">
<DataGrid.Columns>
<DataGridTextColumn>
<DataGridTextColumn.Header>
<TextBlock Text="Test">
<TextBlock.ToolTip>
This is a Tooltip
</TextBlock.ToolTip>
</TextBlock>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn>
<DataGridTextColumn.Header>
<TextBlock Text="Test2" MousEnter="TextBlock_MouseEnter"/>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
// mouse enter handler
private void TextBlock_MouseEnter(object sender, MouseEventArgs e)
{
var column = TheDataGrid.Columns[1];
var header = column.Header as TextBlock;
if (headerIsTrimmed ...) // your logic to check for trim
{
header.ToolTip = "This is another Tooltip";
}
else
{
header.ToolTip = null;
}
}
注意兩個 DataGridTextColumns,第一個我直接設置了工具提示。 但請注意,您必須將 TextBlock 設置為 Header,您可以在其中定義 XAML 中的工具提示。 在第二個 DataGridTextColum 上,我還將 Header 設置為 TextBlock,以便在代碼隱藏或事件處理程序中可以將工具提示添加到 TextBlock 和列標題。
編輯:我在用作標題(第二個)的 TextBlock 上的 MouseEnter 事件中添加了一個事件處理程序,如果檢測到修剪,則可以放置邏輯以將工具提示設置為字符串,否則將其設置為 null .
所以,我找到了一個解決方案。 我剛剛用默認 DataGridHeader 樣式中的自定義工具提示將 ContentPresenter 替換為我的文本塊:
<TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis">
<TextBlock.ToolTip>
<ToolTip Visibility="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget, Converter={StaticResource trimmedVisibilityConverter}}">
<ToolTip.Content>
<TextBlock Text="{Binding}"/>
</ToolTip.Content>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
和轉換器:
public class TrimmedTextBlockVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) return Visibility.Collapsed;
FrameworkElement textBlock = (FrameworkElement)value;
textBlock.Measure(new System.Windows.Size(Double.PositiveInfinity, Double.PositiveInfinity));
if (((FrameworkElement)value).ActualWidth < ((FrameworkElement)value).DesiredSize.Width)
return Visibility.Visible;
else
return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
我不知道這是否是好的解決方案,但它的工作原理完全符合我的需要...感謝大家的回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.