Как заставить ListBox ItemTemplate растягиваться по горизонтали на всю ширину ListBox?
-
22-07-2019 - |
Вопрос
Я хочу, чтобы элементы ListItems своим оранжевым фоном расширялись на всю ширину списка.
В настоящее время они имеют ширину, равную имени и фамилии.
Я установил каждый элемент, который мог:ГоризонтальноеВыравнивание="Растянуть".
Я хочу, чтобы фон ListboxItems расширялся по мере того, как пользователь растягивает Listbox, поэтому я не хочу вводить абсолютные значения.
Что мне нужно сделать, чтобы цвет фона ListBoxItems заполнял ширину ListBox?
<Window x:Class="TestListBoxSelectedItemStyle.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestListBoxSelectedItemStyle"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<local:CustomerViewModel x:Key="TheDataProvider"/>
<DataTemplate x:Key="CustomerItemTemplate">
<Border CornerRadius="5" Background="Orange" HorizontalAlignment="Stretch" Padding="5" Margin="3">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" Width="Auto">
<TextBlock HorizontalAlignment="Stretch">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</Border>
</DataTemplate>
</Window.Resources>
<Grid>
<ListBox ItemsSource="{Binding Path=GetAllCustomers, Source={StaticResource TheDataProvider}}"
ItemTemplate="{StaticResource CustomerItemTemplate}"/>
</Grid>
</Window>
Решение
Я уверен, что это дубликат, но я не могу найти вопрос с тем же ответом.
Добавьте HorizontalContentAlignment = " Растянуть "
в свой ListBox. Это должно делать свое дело. Просто будьте осторожны с автозаполнением, потому что HorizontalAlignment
по ошибке легко получить.
Другие советы
Я нашел другое решение здесь , так как наткнулся на оба поста ... р>
Это из ответа Майлза:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
</Style>
</ListBox.ItemContainerStyle>
Это сработало для меня.
Если ваши товары Шире чем ListBox
, другие ответы здесь не помогут:предметы в ItemTemplate
оставаться шире, чем ListBox
.
Исправление, которое сработало для меня, заключалось в отключении горизонтальной полосы прокрутки, которая, по-видимому, также сообщает контейнеру всех этих элементов, чтобы он оставался шириной только с полем списка.
Следовательно, комбинированное исправление для получения элементов ListBox, ширина которых равна размеру списка, независимо от того, меньше они и требуют растягивания или шире и требуют переноса, выглядит следующим образом:
<ListBox HorizontalContentAlignment="Stretch"
ScrollViewer.HorizontalScrollBarVisibility="Disabled">
Поскольку граница используется только для визуального отображения, вы можете поместить ее в ControlTemplate объекта ListBoxItem и изменить там свойства. В ItemTemplate вы можете разместить только StackPanel и TextBlock. Таким образом, код также остается чистым, так как внешний вид элемента управления будет контролироваться через ControlTemplate, а отображаемые данные будут контролироваться через DataTemplate.
Для меня исправлением было задать свойство HorizontalAlignment = " Растянуть "
в ItemsPresenter
внутри ScrollViewe
r ..
Надеюсь, это кому-нибудь поможет ...
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBox">
<ScrollViewer x:Name="ScrollViewer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}" HorizontalAlignment="Stretch">
<ItemsPresenter Height="252" HorizontalAlignment="Stretch"/>
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
У меня также была та же проблема, поскольку в качестве быстрого обходного пути я использовал blend, чтобы определить, сколько отступов было добавлено. В моем случае это было 12, поэтому я использовал отрицательный запас, чтобы избавиться от него. Теперь все может быть правильно отцентрировано.