WPF TextBlock TextTrimming在使用GridSplitter的网格内不起作用

时间:2016-10-13 06:29:10

标签: c# wpf xaml ellipsis

我的XAML代码中有以下结构:

 <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200" MinWidth="200"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*" MinWidth="100"/>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto" MinWidth="150"/>
        </Grid.ColumnDefinitions>           
        <ListBox ItemsSource="{Binding MessagesCollectionView}" Margin="0">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <Label Foreground="Black" FontSize="14">
                            <TextBlock Text="{Binding Title}" TextTrimming="CharacterEllipsis"/>
                        </Label>
                        <Label Foreground="Gray" FontSize="12">
                            <TextBlock Text="{Binding Content}" TextTrimming="CharacterEllipsis"/>
                        </Label>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <GridSplitter Width="5" Grid.Column="1" HorizontalAlignment="Stretch"/>
<!--More stuff here......-->

我在这里简化了XAML代码,或者它使整个问题变得混乱。我有5列,按此顺序,从左到右:ListBoxGridSplitterRichTextBoxGridSplitterListView。我只是展示了前两列,因为剩下的几乎是一样的。

当我加载我的程序时,TextBoxes没有显示任何省略号,从不。我甚至尝试给ListBox一个固定的大小。

是否有人知道如何修复省略号以显示?我认为这可能涉及Grid内的控件如何在{{1}时被告知其大小}}

我的目标是中间视图有GridSplitter的UI,左边和右边的视图一开始是固定大小的,但是如果用户想要可以拉伸。

编辑:

这就是我想要的:

Text with Ellipsis

这就是我得到的:

Text without Ellipsis

3 个答案:

答案 0 :(得分:2)

我不确定,如果你找到了解决方案,但我认为以下内容可以帮到你(请参阅我的评论内联):

<Window x:Class="SO40013780.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SO40013780"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="200">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <ListBox Name="TheList" Grid.Column="0">
      <ListBox.Template>
        <!-- Override the default controll template for the listbox -->
        <ControlTemplate TargetType="{x:Type ListBox}">
          <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="True">
            <!-- OBS: HorizontalScrollBarVisibility="Disabled" is the CHANGE -->
            <ScrollViewer Focusable="False" Padding="{TemplateBinding Padding}" HorizontalScrollBarVisibility="Disabled">
              <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
            </ScrollViewer>
          </Border>
          <ControlTemplate.Triggers>
            <Trigger Property="IsEnabled" Value="False">
              <Setter Property="Background" TargetName="Bd" Value="White"/>
              <Setter Property="BorderBrush" TargetName="Bd" Value="#FFD9D9D9"/>
            </Trigger>
            <MultiTrigger>
              <MultiTrigger.Conditions>
                <Condition Property="IsGrouping" Value="True"/>
                <Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="False"/>
              </MultiTrigger.Conditions>
              <Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
            </MultiTrigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </ListBox.Template>
      <ListBox.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding}" TextTrimming="CharacterEllipsis" Background="Yellow" Foreground="Red" />
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    <GridSplitter Width="5" HorizontalAlignment="Center" VerticalAlignment="Stretch" Grid.Column="1" />
    <Border Background="Blue" Grid.Column="2" />
  </Grid>
</Window>

首先,我认为它与柱子和分离器无关。

上面的xaml中的魔术是模板中滚动查看器上的Horizo​​ntalScrollBarVisibility =“Disabled”。使用此设置,列表框中的水平滚动被取消,因此当列表框变得比项目中的文本更窄时,内联文本块中的文本修剪应该接管。

enter image description here

答案 1 :(得分:0)

在阅读Henrik Hansen的回答后,我意识到解决方案非常简单,只需要ListBox上的一行简单的代码。

ScrollViewer.HorizontalScrollBarVisibility="Disabled"

这可以防止内部控件获取他们想要的所有宽度,而是将它们限制为列的宽度。

答案 2 :(得分:-1)

在内容控件中更改文本属性时,不会更改省略号。我检查了ms文件。为了做到这一点,你应该编写一个属性并将TextTrimProperty绑定到它(在viewmodel中执行逻辑)或为TextBlock编写一个转换器 要么 你可以编写自己的TextBlock类并为textblock文本属性创建一个回调方法。然后在其中操作你的文本。 正如我告诉你的那样,文本更改后不会触发texttrimming。