在DataGrid中修剪文本时自动工具提示

时间:2014-03-28 10:09:00

标签: c# wpf datagrid tooltip trim

我的应用程序使用C#和WPF(.net framework 4.0)运行。我的目标是建立一个DataGrid,其中单元格中的文本用省略号进行修剪,并且只有在单元格中的文本被实际修剪时才会自动显示工具提示。

解决方案1 ​​:我目前正在使用它来了解文本是否被修剪:http://tranxcoder.wordpress.com/2008/10/12/customizing-lookful-wpf-controls-take-2/ 问题是它只在我调整列的大小时才有效。首次加载DataGrid,排序列时,或更新DataGrid的ItemSource时,工具提示都不会显示。

解决方案2 :我也试过这个:http://www.scottlogic.com/blog/2011/01/31/automatically-showing-tooltips-on-a-trimmed-textblock-silverlight-wpf.html 但工具提示永远不会出现在我的DataGrid单元格上,而它可以与隔离的文本块一起使用。

我正在寻找简单的方法来改进解决方案1,并在所有情况下使其在我的DataGrid中运行,或者采用不同的方法。

解决方案1的风格:

<UserControl.Resources>
    <Style x:Key="TextColumnElementStyle" TargetType="TextBlock" BasedOn="{StaticResource TextBlockService}">
        <Style.Setters>
            <Setter Property="TextWrapping" Value="NoWrap" />
            <Setter Property="TextTrimming" Value="WordEllipsis" />
        </Style.Setters>
    </Style>
</UserControl.Resources>

The source code of the TextBlockService

解决方案1的DataGrid:

<DataGrid ItemsSource="{Binding IssueList}" tbs:TextBlockService.AutomaticToolTipEnabled="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Description" Binding="{Binding Description}" 
            ElementStyle="{StaticResource TextColumnElementStyle}">
    </DataGrid.Columns>
</DataGrid>

由于

2 个答案:

答案 0 :(得分:4)

我找到了完美的解决方案,基于an answer by xr280xr。 它可以在任何条件下开箱即用,而无需使用其他代码。

我放入<DataGrid.Resources>的风格:

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridCell}">
                <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text}" TextTrimming="CharacterEllipsis">
                    <TextBlock.ToolTip>
                        <ToolTip Visibility="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget, Converter={StaticResource TrimToVisConverter}}">
                            <ToolTip.Content>
                                <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text}"/>
                            </ToolTip.Content>
                        </ToolTip>
                    </TextBlock.ToolTip>
                 </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Converter={StaticResource TrimToVisConverter}的来源:

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();
    }
}

答案 1 :(得分:0)

我还不能发表评论,我缺少必要的观点。

但是我只想向可接受的答案代码添加一个额外的提示,以供像我这样想要使用它的菜鸟使用。

如果您想将Converter链接到其代码,请确保如下所述在Window / UserControl资源中创建一个链接:

<Window.Resources>
    <local:TrimmedTextBlockVisibilityConverter x:Key="TrimToVisConverter" />
</Window.Resources>

关于已接受答案的其他想法:您还必须将默认DataGridCell模板随附的任何样式重写为DataGridCell States。否则,您将失去对行选择和其他内容的清晰了解...