Проблема заключалась в том, что 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