簡體   English   中英

用於列標題的 Wpf DataGrid 工具提示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM