首页 文章

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

提问于
浏览
1

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

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

Solution 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>

谢谢

1 回答

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

相关问题