自动网格列中的Texttrimming

时间:2016-11-03 08:59:28

标签: wpf

我想在WPF中使用非常简单的东西,但我不能让它工作:

我有一个包含2列的网格:一个*和一个Auto。第二列包含TextBlock。我需要texttrimming来处理这个TextBlock。这当前不起作用,因为TextBlock超出了网格的范围。

额外信息:

  • 第二列应足够宽以包含TextBlock。第一列应包含所有剩余空间。如果网格的宽度不足以包含所需的TextBlock宽度,则应修剪文本。
  • 调整窗口大小时,网格的宽度会发生变化。
  • 没有什么是静态的(不是文本,没有大小),因此不能使用硬编码值。
  • ClipToBounds属性无法解决此问题。
  • 我无法将TextBlock的MaxWidth绑定到列的宽度,否则TextBlock只会变小,但在调整窗口大小时不会变大。

重现问题的代码(例如在Kaxaml中):

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <DockPanel>
      <Grid Height="20" Background="Blue" DockPanel.Dock="Top" Margin="100 0 100 0">
         <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="Auto" MaxWidth="200"/>
         </Grid.ColumnDefinitions>
         <TextBlock
            Grid.Column="1"
            Background="Red"
            Text="Test tralalalalalalalalalala long string this should be trimmed!"
            TextTrimming="CharacterEllipsis"/>
      </Grid>
   </DockPanel>
</Page>

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

第二种解决方案: 使用这样的转换器:

namespace StackStuff{

class WidthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if(value is Double)
        {
            return (double)value - 200; // 200 = 100+100 form the grid margin
        }

        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

}

在视图中,您将拥有:

xmlns:local="clr-namespace:StackStuff"

然后,您必须添加转换器才能使用它:

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

然后你必须实现转换器:

<DockPanel Background="Green" x:Name="dock">
        <Grid Height="20" Background="Blue" DockPanel.Dock="Top" Margin="100 0 100 0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <TextBlock MaxWidth="{Binding ActualWidth, Converter={StaticResource WidthConverter}, ElementName=dock}"
                       Grid.Column="1"

希望这是你想要的。

相关问题