我的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列,按此顺序,从左到右:ListBox
,GridSplitter
,RichTextBox
,GridSplitter
,ListView
。我只是展示了前两列,因为剩下的几乎是一样的。
当我加载我的程序时,TextBoxes
没有显示任何省略号,从不。我甚至尝试给ListBox
一个固定的大小。
是否有人知道如何修复省略号以显示?我认为这可能涉及Grid
内的控件如何在{{1}时被告知其大小}}
我的目标是中间视图有GridSplitter
的UI,左边和右边的视图一开始是固定大小的,但是如果用户想要可以拉伸。
答案 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中的魔术是模板中滚动查看器上的HorizontalScrollBarVisibility =“Disabled”。使用此设置,列表框中的水平滚动被取消,因此当列表框变得比项目中的文本更窄时,内联文本块中的文本修剪应该接管。
答案 1 :(得分:0)
在阅读Henrik Hansen的回答后,我意识到解决方案非常简单,只需要ListBox
上的一行简单的代码。
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
这可以防止内部控件获取他们想要的所有宽度,而是将它们限制为列的宽度。
答案 2 :(得分:-1)
在内容控件中更改文本属性时,不会更改省略号。我检查了ms文件。为了做到这一点,你应该编写一个属性并将TextTrimProperty绑定到它(在viewmodel中执行逻辑)或为TextBlock编写一个转换器 要么 你可以编写自己的TextBlock类并为textblock文本属性创建一个回调方法。然后在其中操作你的文本。 正如我告诉你的那样,文本更改后不会触发texttrimming。