WPF:CheckBox中的TextTrimming没有固定宽度

时间:2012-10-15 08:25:13

标签: wpf checkbox grid resizable texttrimming

我有一个位于网格中的复选框,其列跨度为3,其中2列可调整大小,并且可以在运行时调整大小。

我希望复选框在文本不适合时显示省略号,但无法使其生效。

这是我的XAML代码。

<Grid>
     <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" />
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="Auto" />
     </Grid.ColumnDefinitions>
...
    <CheckBox IsEnabled="False"  Grid.Row="2" Padding="5" Margin="11,12,0,0" Name="chkSelectedCat" VerticalAlignment="Top" HorizontalAlignment="Stretch" Grid.ColumnSpan="3">
         <AccessText Text="Search in selected category only." TextTrimming="CharacterEllipsis"/>
    </CheckBox>

提前感谢您的帮助。

修改

有问题的CheckBox位于Grid内,而GroupBox又包含在GridSplitter中,该{{1}}位于与使用{{调整大小的列相邻的列中的列中1}}。

1 个答案:

答案 0 :(得分:0)

问题在于,GroupBox为其子控件分配了无限宽度,如此MSDN forum thread.所述

事实上,将MaxWidth设置为CheckBox时,文本修剪功能正常并显示省略号。

但是,在运行时需要更改CheckBox最大宽度。

我尝试使用MultiValueConverterMaxWidth的{​​{1}}绑定到三列的总CheckBox,但ActualWidth方法只是在初始化期间被调用(我认为这与Convert如何为其子控件分配大小有关。)

无论如何,我设法通过移除GroupBox的{​​{1}}并在ChechkBox中使用AccessText来取代我想要的内容,然后将所有内容包围起来TextBlock

StackPanel

Border的大小发生变化时,我会更新事件处理程序中StackPanel的<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

希望这可以帮助将来的某个人(即使它有点像黑客)。

<强>更新

如果您可以取消TextBox并改为使用private void chkBorder_SizeChanged(object sender, SizeChangedEventArgs e) { this.txtChkSelectedCat.Width = this.chkBorder.ActualWidth - this.chkSelectedCat.ActualWidth - 11 - 5 - 5; // margins } ,则StackPanel会自动生效,而不必进行任何事件处理,如下所示。

Grid

确保将包含文本框的列的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"不起作用。