Jak uzyskać ListBox ItemTemplate, aby rozciągnąć w poziomie pełną szerokość ListBox?

356

Chcę mieć ListItems, aby rozszerzyć ich pomarańczowym tłem na pełną szerokość Listbox.

Obecnie są one tak szerokie, jak FirstName + LastName.

Ustawiłem każdy element, który mogę: HorizontalAlignment = "Stretch".

Chcę, aby tło ListboxItems rozszerzyło się, gdy użytkownik rozciąga Listbox, więc nie chcę wprowadzać wartości bezwzględnych.

Co muszę zrobić, aby kolor tła ListBoxItems wypełniał szerokość 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>
Edward Tanguay
źródło

Odpowiedzi:

468

Jestem pewien, że to duplikat, ale nie mogę znaleźć pytania z tą samą odpowiedzią.

Dodaj HorizontalContentAlignment="Stretch"do swojej ListBox. To powinno wystarczyć. Bądź ostrożny z funkcją autouzupełniania, ponieważ tak łatwo jest uzyskać HorizontalAlignmentomyłkę.

Matt Hamilton
źródło
1
@ Agile Jedi, czy znasz rozwiązanie, kiedy masz niestandardowe elementy ListBox? Sam wpadam na ten problem.
eoldre
11
Z jakiegoś powodu to rozwiązanie nie działa w Silverlight. Z drugiej strony rozwiązanie Gabriela
TimothyP
6
To nie działa na kontrolkach WinRT ListView. Już tego próbowałem.
uSeRnAmEhAhAhAhAhA
3
Działa to dobrze na niestandardowych listach (Windows, a nie Silverlight), po prostu bądź ostrożny z autouzupełnianiem podczas pisania xaml. Jeśli napiszesz „Horiz ..”, otrzymasz „HorizontalAlignment”, a nie „HorizontalContentAlignment”. Wybór pierwszej sugestii jest dość łatwy, ponieważ obie używają „Rozciągnij”.
Jarle Bjørnbeth
1
Elementy niestandardowe działają dla mnie, jeśli ustawię niestandardową szerokość elementu na auto.
Lensflare,
646

Znalazłem tutaj inne rozwiązanie , ponieważ wpadłem na oba posty ...

To jest odpowiedź Mylesa:

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

To zadziałało dla mnie.

Gabriel Mongeon
źródło
@CameronMacFarland Przyczyną Silverlight, przynajmniej w moim przypadku, jest to, że pracownicy administracyjni IT nie mogli dowiedzieć się, jak wdrożyć aplikacje WPF / Winform przy użyciu Active Directory, i chcieliśmy scenariusza czystego wdrożenia, który nie byłby zależny od nas. Sneakernetting aktualizacje.
Richard B
@RichardB lol Mój komentarz był bardziej ukierunkowany na silverlight, ponieważ dlaczego silverlight musi być inny i mieć zepsuty szablon w porównaniu do WPF.
Cameron MacFarland
@CameronMacFarland ah ... nie martw się. Po zrobieniu aplikacji Silverlight i zmaganiu się z plikiem ServiceReferences.ClientConfig, jestem ustawiony, że uniknę (jak zarazę) ponownego tworzenia kolejnej aplikacji Silverlight. To był fajny pomysł, ale nie imponujący.
Richard B
1
Aby to działało dla szablonu danych w obrębie listView: <ListView.ItemContainerStyle> <Style TargetType = "ListViewItem"> <Właściwość Setter = "HorizontalContentAlignment" Wartość = „Rozciągnięcie>> </Setter> </Style> </ ListView .ItemContainerStyle>
Christopher Cook
Błąd: błąd ścieżki BindingExpression: nie znaleziono właściwości „Szerokość” w Project.CustomElement, Project.WindowsPhone, Wersja = 1.0.0.0, Kultura = neutralna, PublicKeyToken = null. BindingExpression: Path = 'Width' DataItem = Project.CustomElement, Project.WindowsPhone, Version = 1.0.0.0, Culture = neutralny, PublicKeyToken = null '; elementem docelowym jest „Windows.UI.Xaml.Controls.Grid” (Name = „null”); właściwość docelowa to „Szerokość” (typ „Double”)
Czarny Cid
72

Jeśli twoje przedmioty są szersze niż ListBox, inne odpowiedzi tutaj nie pomogą: przedmioty w ItemTemplatepozostałych są szersze niż ListBox.

Rozwiązaniem, które działało dla mnie, było wyłączenie poziomego paska przewijania, który najwyraźniej mówi również, że kontener wszystkich tych elementów ma pozostać tak szeroki, jak pole listy.

Dlatego łączna poprawka, aby uzyskać elementy ListBox, które są tak szerokie jak pole listy, niezależnie od tego, czy są mniejsze i wymagają rozciągania, czy szersze i wymagają zawijania, wygląda następująco:

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

( kredyty za pomysł paska przewijania )

Roman Starkov
źródło
0

Ponieważ ramka służy tylko do wyglądu, możesz umieścić ją w ControlTemplate ListBoxItem i zmodyfikować tam właściwości. W ItemTemplate można umieścić tylko StackPanel i TextBlock. W ten sposób kod również pozostaje czysty, ponieważ wyglądem formant będzie kontrolowany za pomocą ControlTemplate, a wyświetlane dane będą kontrolowane za pomocą DataTemplate.

Sangeetha
źródło
0

Rozwiązaniem dla mnie było, aby ustawić właściwości HorizontalAlignment="Stretch"na ItemsPresenterśrodku ScrollViewer ..

Mam nadzieję, że to pomoże komuś ...

<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>
Ivica Marinčić
źródło
0

Miałem również ten sam problem, ponieważ w celu szybkiego obejścia tego problemu użyłem metody mieszania. W moim przypadku było to 12, więc użyłem ujemnego marginesu, aby się go pozbyć. Teraz wszystko można teraz poprawnie wyśrodkować

Michael Ato Hutchful
źródło