问题是GroupBox
它的子控件分配了无限宽度,正如在这个MSDN 论坛线程中所讨论的那样。
事实上,当将 a 设置为 时MaxWidth
,CheckBox
文本修剪会起作用并显示省略号。
但是,CheckBox
最大宽度需要在运行时更改。
我尝试使用MultiValueConverter将 的 绑定到三列MaxWidth
的CheckBox
总数ActualWidth
,但该Convert
方法仅在初始化期间被调用(我再次认为这与如何GroupBox
将大小分配给其子控件有关)。
ChechkBox
无论如何,我设法通过删除'sAccessText
并使用 aTextBlock
代替StackPanel
它,然后用 a 包围所有内容来实现我想要的Border
。
<Border Grid.Row="2" Grid.ColumnSpan="3" Name="chkBorder" SizeChanged="chkBorder_SizeChanged">
<StackPanel Orientation="Horizontal" VerticalAlignment="Stretch">
<CheckBox IsEnabled="False" Padding="0" Margin="11,7,0,5" Name="chkSelectedCat" VerticalAlignment="Center"/>
<TextBlock Foreground="Black" Name="txtChkSelectedCat" Text="Search in selected category only." TextTrimming="CharacterEllipsis" TextWrapping="NoWrap" VerticalAlignment="Center" Margin="0,5,5,5"/>
</StackPanel>
</Border>
当Border
更改大小时,我会更新Width
事件处理程序中 StackPanel 的 ,并相应地更新TextBox
修剪中的文本。
private void chkBorder_SizeChanged(object sender, SizeChangedEventArgs e)
{
this.txtChkSelectedCat.Width = this.chkBorder.ActualWidth - this.chkSelectedCat.ActualWidth - 11 - 5 - 5; // margins
}
希望这对将来的某人有所帮助(即使它是一种黑客行为)。
更新
如果您可以消除StackPanel
并使用 aGrid
代替,则TextTrimming
自动工作,无需进行任何事件处理,如下所示。
<Grid Grid.Row="2" Grid.ColumnSpan="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<CheckBox Grid.Column="0" IsEnabled="False" Padding="0" Margin="11,7,0,5" Name="chkSelectedCat" VerticalAlignment="Center" ToolTipService.ShowOnDisabled="True"/>
<TextBlock Grid.Column="1" Foreground="Black" Name="txtChkSelectedCat" Text="Search in selected category only." TextTrimming="CharacterEllipsis" TextWrapping="NoWrap" VerticalAlignment="Center" Margin="0,5,5,5" MouseLeftButtonDown="txtChkSelectedCat_MouseLeftButtonDown" ToolTip="{Binding ElementName=chkSelectedCat, Path=ToolTip}" />
</Grid>
确保将Width
包含文本框的列的 设置为"*"
,因为"Auto"
基本上告诉TextBox
它可以拥有尽可能多的空间,因此TextTrimming
不起作用。