WPF: TextTrimming в CheckBox без фиксированной ширины

У меня есть флажок, расположенный в сетке с диапазоном столбцов 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.


person Rachel    schedule 15.10.2012    source источник
comment
Как изменить размер столбцов и какое изменение размера столбца не работает? Я поместил GridSplitter в третий столбец, и изменение размера с многоточием работает, как задумано.   -  person Sisyphe    schedule 15.10.2012
comment
@Sisyphe Сетка расположена внутри GroupBox, который, в свою очередь, находится внутри столбца с изменяемым размером. Размер этого (внешнего) столбца может быть изменен пользователем с помощью GridSplitter, расположенного в столбце слева от него.   -  person Rachel    schedule 15.10.2012


Ответы (1)


Проблема заключалась в том, что GroupBox выделяет бесконечную ширину своим дочерним элементам управления, как обсуждалось в этом Ветка форума MSDN.

На самом деле, при установке MaxWidth на CheckBox работала обрезка текста и отображалось многоточие.

Однако максимальную ширину CheckBox нужно было изменить во время выполнения.

Я попытался использовать MultiValueConverter для привязки MaxWidth из CheckBox в общее количество ActualWidth из трех столбцов, но метод Convert вызывался только во время инициализации (опять же, я думаю, что это как-то связано с тем, как GroupBox назначает размеры своим дочерним элементам управления).

В любом случае мне удалось добиться того, чего я хотел, удалив AccessText из ChechkBox и используя вместо него TextBlock в StackPanel, а затем окружив все 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 и использовать вместо него 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" в основном сообщает TextBox, что он может иметь столько места, сколько хочет, поэтому TextTrimming не будет работать.

person Rachel    schedule 23.10.2012