Як домогтися шаблону ListBox ItemTemplate для горизонтального розтягування по всій ширині ListBox?


356

Я хочу, щоб ListItems розширили помаранчевим фоном всю ширину списку.

Наразі вони лише такі широкі, як FirstName + LastName.

Я встановив кожен елемент, який я можу: HorizontalAlignment = "Stretch".

Я хочу, щоб фон 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>

Відповіді:


468

Я впевнений, що це дублікат, але я не можу знайти питання з такою ж відповіддю.

Додайте HorizontalContentAlignment="Stretch"до свого списку. Це повинно зробити трюк. Будьте обережні з автоматичним завершенням, тому що це так легко отримати HorizontalAlignmentпомилково.


1
@ Agile Jedi, чи знаєте ви рішення, коли у вас є власні елементи ListBox? Я зіткнувся з цим питанням сам.
eoldre

11
Насправді це рішення чомусь не працює в Silverlight. З іншого боку, рішення Габріеля
ТимофійП

6
Це не працює на елементах управління WinRT ListView. Я вже пробував.
uSeRnAmEhAhAhAhAhA

3
Це добре працює у користувацьких списках (Windows, а не Silverlight), будьте обережні з автоматичним завершенням при написанні xaml. Якщо ви напишете "Horiz ..", ви отримаєте "HorizontalAlignment", а не "HorizontalContentAlignment". Вибрати першу пропозицію досить просто, оскільки обидва використовують "Stretch".
Jarle Bjørnbeth

1
Користувацькі елементи працюють для мене, якщо я встановив власну ширину елемента для автоматичного.
Lensflare

646

Тут я знайшов інше рішення , оскільки зіткнувся з обома посадами ...

Це з відповіді Майлза:

<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
        <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> 
    </Style> 
</ListBox.ItemContainerStyle> 

Це працювало для мене.


@CameronMacFarland Причина Silverlight, принаймні в моєму випадку, полягає в тому, що персонал ІТ-адміністратора не міг зрозуміти, як розгорнути програми WPF / Winform за допомогою Active Directory, і ми хотіли, щоб чистий сценарій розгортання не залежав від нас Sneakernetting оновлення.
Річард Б

@RichardB lol Мій коментар був більше спрямований на сріблясте світло, тому що, чому саме Silverlight має бути іншим та мати зламаний шаблон порівняно з WPF.
Камерон Макфарланд

@CameronMacFarland ах ... не хвилюйся. Після створення програми Silverlight і боротьби з файлом ServiceReferences.ClientConfig я встановив, що я уникаю (як чума) коли-небудь знову розробляти інший додаток Silverlight. Це була класна ідея, але просто не вражаюча.
Річард Б

1
Щоб це працювало для шаблону даних у списку listView: <ListView.ItemContainerStyle> <Style TargetType = "ListViewItem"> <Setter Properties = "HorizontalContentAlignment" Value = "Stretch"> </Setter> </Style> </ ListView .ItemContainerStyle>
Крістофер Кук

Помилка: помилка контуру BindingExpression: властивість 'Width' не знайдено в Project.CustomElement, Project.WindowsPhone, версія = 1.0.0.0, культура = нейтральна, PublicKeyToken = null '. BindingExpression: Path = 'Ширина' DataItem = Project.CustomElement, Project.WindowsPhone, версія = 1.0.0.0, культура = нейтральна, PublicKeyToken = null '; цільовим елементом є 'Windows.UI.Xaml.Controls.Grid' (Name = 'null'); цільовим властивістю є "Ширина" (тип "Подвійний")
Black Cid

72

Якщо ваші предмети ширші, ніж ListBoxінші, інші відповіді тут не допоможуть: елементи ItemTemplateзалишаються ширшими за ListBox.

Виправлення, яке працювало для мене, полягало в тому, щоб відключити горизонтальну смугу прокрутки, яка, мабуть, також повідомляє контейнеру всіх цих елементів залишатися лише таким же широким, як і поле списку.

Отже, комбінований виправлення, щоб отримати елементи ListBox, які є такими ж широкими, як і поле списку, незалежно від того, вони менші та потребують розтягування, або ширші та потребують обгортання, полягає в наступному:

<ListBox HorizontalContentAlignment="Stretch" 
         ScrollViewer.HorizontalScrollBarVisibility="Disabled">

( кредити для ідеї прокрутки )


0

Оскільки рамка використовується лише для візуального вигляду, ви можете помістити її в ControlTemplate ListBoxItem та змінити там властивості. У ItemTemplate ви можете розмістити лише StackPanel та TextBlock. Таким чином, код також залишається чистим, оскільки за зовнішнім виглядом елемент керування буде керуватися через ControlTemplate, а дані, що відображаються, будуть контролюватися через DataTemplate.


0

Виправленням для мене було встановити властивість HorizontalAlignment="Stretch"на ItemsPresenterвнутрішній ScrollVieweр ..

Сподіваюся, це допоможе комусь ...

<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>

0

У мене також була така ж проблема, як швидкий спосіб вирішення, я використовував суміш, щоб визначити, скільки додається набивання. У моєму випадку це було 12, тому я використав негативний запас, щоб позбутися від нього. Тепер все можна зосередити належним чином

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.