0

我有一个位于列跨度为 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问题的位于 a 内Grid,而 a 又包含在 a 内GroupBox,该列位于与使用 a 调整大小的列相邻的列中GridSplitter

4

1 回答 1

1

问题是GroupBox它的子控件分配了无限宽度,正如在这个MSDN 论坛线程中所讨论的那样。

事实上,当将 a 设置为 时MaxWidthCheckBox文本修剪会起作用并显示省略号。

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

我尝试使用MultiValueConverter将 的 绑定到三列MaxWidthCheckBox总数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不起作用。

于 2012-10-23T06:50:40.800 回答