【问题标题】:Texttrimming in Auto grid column自动网格列中的文本修剪
【发布时间】:2017-03-16 19:00:06
【问题描述】:

我想要 WPF 中的一些非常简单的东西,但我没有让它工作:

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

额外信息:

  • 第二列的宽度应刚好足以包含 TextBlock。第一列应包含所有剩余空间。如果 Grid 的宽度不足以包含 TextBlock 的所需宽度,则应修剪文本。
  • 调整窗口大小时,Grid 的宽度会发生变化。
  • 没有什么是静态的(不是文本,没有大小),因此不能使用硬编码值。
  • 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>

有什么建议吗?

【问题讨论】:

    标签: wpf


    【解决方案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"
    

    希望这是你想要的。

    【讨论】:

    • 那么当窗口调整大小时,文本块将不再调整大小:列将保持相同的宽度,因为文本块保持相同的宽度,因为列保持相同的宽度......
    • 你是对的@Lander。在您的原始帖子中尝试此修复:&lt;ColumnDefinition Width="*" MaxWidth="200"/&gt; 它在第二列定义中有 * 而不是 Auto
    • 在 Auto 列上添加一个固定的 MaxWidth 将解决此问题。问题:一切都是动态的,所以我不能使用固定值。
    • 添加 * 而不是 auto,即使您不使用 MaxWidth 也可以使用。
    • 但是网格的宽度只会被两列分开。我需要第二列足够宽以适合 TextBlock。如果没有足够的可用空间,TextBlock 应该用完所有空间并使用文本修剪。
    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 2013-08-02
    • 2014-05-07
    • 1970-01-01
    • 2021-07-13
    • 2020-01-20
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多