【问题标题】:WPF TextBlock TextTrimming Not Working Inside a Grid With GridSplitterWPF TextBlock TextTrimming 在使用 GridSplitter 的网格内不起作用
【发布时间】:2017-02-22 03:38:06
【问题描述】:

我的 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 一个固定大小。

有谁知道如何修复 Ellipsis 以显示?我相信这可能与 Grid 内的控件在有 GridSplitter 时如何获知其大小有关。

我的目标是一个 UI,其中中间视图有一个 * width,左右视图最初是固定大小的,但如果用户愿意,可以拉伸。


编辑:

这就是我想要的:

这是我得到的:

【问题讨论】:

    标签: c# wpf xaml ellipsis


    【解决方案1】:

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

    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
    

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

    【讨论】:

      【解决方案2】:

      我不确定,如果您找到了解决方案,但我认为以下内容可以帮助您(请参阅我的 cmets inline):

      <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"。使用此设置,列表框中的水平滚动将被禁用,因此当列表框变得比项目中的文本窄时,内联文本块中的文本修剪应该接管。

      【讨论】:

      • 您为什么认为这会有所帮助?有什么改进?秘诀是什么?
      • @mFeinstein:我真的只是想帮忙。您必须很容易测试它是否有效(只需将 ListBox.Template-tag 复制/粘贴到您的 xaml 中并设置结果)。上面的代码中有两个内联 cmets。 ScrollViewer 上的 Horizo​​ntalScrollBarVisibility="Disabled" 可以解决问题(是秘诀)。
      • 我只是想了解您的解决方案及其工作原理和原因
      • 好的,现在我明白你的想法了,是的,它有效,谢谢!但是我需要的唯一代码是ListBox 上的ScrollViewer.HorizontalScrollBarVisibility="Disabled",无需为此设置整个模板。
      • @mFeinstein:好的,更智能、更清洁。从这里开始很好的编码。
      【解决方案3】:

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

      【讨论】:

      • 我实际上是在使用 MVVM,但我认为 thias 最后并没有什么不同。我只想将名称更改为Message,因为Collection 暗示它是一个集合,显然它不是。我会对此进行测试并通知您。
      • 您在我的代码中究竟做了哪些更改?为了清楚起见,我没有在文本上得到Ellipsis,我确实得到了文本,只是超出了GridSplitter 限制的文本,使用GridSplitter 调整列大小时你得到Ellipsis 吗?。
      • “作品”是什么意思?我的 ViewModel 还在 TextBoxes 中显示了所有正确的字符串。
      • 我想你又误会了。这不是改变文本。这是关于让它在第一次工作时,没有任何变化。如果我使 TextBlock 固定大小它可以工作,所以这与绑定无关。
      • @mFeinstein 如果您不将文本块宽度设置为固定大小,则使用 texttrim 毫无意义。我不明白,如果您想使用 texttrim 显然您必须将文本块宽度设置为固定大小。
      猜你喜欢
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 2014-10-10
      相关资源
      最近更新 更多