Wie kann eine ListBox ItemTemplate horizontal über die gesamte Breite der ListBox gestreckt werden?

356

Ich möchte, dass die ListItems mit ihrem orangefarbenen Hintergrund die gesamte Breite der Listbox erweitern.

Derzeit sind sie nur so breit wie der Vorname + Nachname.

Ich habe jedes Element festgelegt, das ich kann: HorizontalAlignment = "Stretch".

Ich möchte, dass der Hintergrund der ListboxItems erweitert wird, wenn der Benutzer die Listbox streckt, damit ich keine absoluten Werte eingeben möchte.

Was muss ich tun, damit die Hintergrundfarbe der ListBoxItems die Breite der ListBox ausfüllt?

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

Antworten:

468

Ich bin sicher, dass dies ein Duplikat ist, aber ich kann keine Frage mit derselben Antwort finden.

Fügen Sie HorizontalContentAlignment="Stretch"Ihrer ListBox hinzu. Das sollte den Trick machen. Seien Sie nur vorsichtig mit der automatischen Vervollständigung, da es so leicht ist, versehentlich zu kommen HorizontalAlignment.

Matt Hamilton
quelle
1
@ Agile Jedi, kennen Sie eine Lösung, wenn Sie benutzerdefinierte ListBox-Elemente haben? Ich bin selbst auf dieses Problem gestoßen.
Eoldre
11
Tatsächlich funktioniert diese Lösung in Silverlight aus irgendeinem Grund nicht. Gabriels Lösung dagegen tut es
TimothyP
6
Dies funktioniert nicht mit WinRT ListView-Steuerelementen. Ich habe es schon versucht.
uSeRnAmEhAhAhAhAhA
3
Dies funktioniert gut bei benutzerdefinierten Listen (Windows, nicht Silverlight). Achten Sie beim Schreiben der XAML nur auf die automatische Vervollständigung. Wenn Sie "Horiz .." schreiben, erhalten Sie "HorizontalAlignment" und nicht "HorizontalContentAlignment". Es ist ziemlich einfach, den ersten Vorschlag auszuwählen, da beide "Stretch" verwenden.
Jarle Bjørnbeth
1
Benutzerdefinierte Elemente funktionieren für mich, wenn ich die Breite der benutzerdefinierten Elemente auf "Automatisch" setze.
Lensflare
646

Ich habe hier eine andere Lösung gefunden , da ich auf beide Post gestoßen bin ...

Dies ist aus der Myles-Antwort:

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

Das hat bei mir funktioniert.

Gabriel Mongeon
quelle
@CameronMacFarland Der Grund für Silverlight liegt zumindest in meinem Fall darin, dass die Mitarbeiter des IT-Administrators nicht herausfinden konnten, wie WPF / Winform-Apps mithilfe von Active Directory bereitgestellt werden, und wir wollten ein sauberes Bereitstellungsszenario, das nicht von uns Sneakernetting abhängt die Updates.
Richard B
@RichardB lol Mein Kommentar war mehr auf Silverlight gerichtet, da Silverlight anders sein muss und eine kaputte Vorlage im Vergleich zu WPF hat.
Cameron MacFarland
@ CameronMacFarland ah ... keine Sorge. Nachdem ich eine Silverlight-App erstellt und mit der Datei ServiceReferences.ClientConfig zu kämpfen habe, werde ich vermeiden, dass ich (wie die Pest) jemals wieder eine andere Silverlight-Anwendung entwickle. Es war eine coole Idee, aber einfach nicht beeindruckend.
Richard B
1
So funktioniert dies für eine Datenvorlage in einer listView: <ListView.ItemContainerStyle> <Style TargetType = "ListViewItem"> <Setter Property = "HorizontalContentAlignment" Value = "Stretch"> </ Setter> </ Style> </ ListView .ItemContainerStyle>
Christopher Cook
Fehler: BindingExpression-Pfadfehler: Die Eigenschaft 'Width' wurde in Project.CustomElement, Project.WindowsPhone, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null nicht gefunden. BindingExpression: Path = 'Width' DataItem = Project.CustomElement, Project.WindowsPhone, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null '; Zielelement ist 'Windows.UI.Xaml.Controls.Grid' (Name = 'null'); Zieleigenschaft ist 'Breite' (Typ 'Double')
Black Cid
72

Wenn Ihre Artikel sind breiter als die sind ListBox, helfen die anderen Antworten hier nicht weiter: Die Artikel in ItemTemplatebleiben breiter als die ListBox.

Die Lösung, die für mich funktioniert hat, bestand darin, die horizontale Bildlaufleiste zu deaktivieren, die anscheinend auch den Container aller dieser Elemente anweist, nur so breit wie das Listenfeld zu bleiben.

Daher lautet die kombinierte Korrektur zum Abrufen von ListBox-Elementen, die so breit wie das Listenfeld sind, unabhängig davon, ob sie kleiner sind und gedehnt werden müssen oder breiter und umbrochen werden müssen, wie folgt:

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

( Credits für die Idee der Bildlaufleiste )

Roman Starkov
quelle
0

Da der Rahmen nur für die visuelle Darstellung verwendet wird, können Sie ihn in die ControlTemplate von ListBoxItem einfügen und dort die Eigenschaften ändern. In der ItemTemplate können Sie nur das StackPanel und den TextBlock platzieren. Auf diese Weise bleibt der Code auch sauber, da das Erscheinungsbild des Steuerelements über die ControlTemplate gesteuert wird und die anzuzeigenden Daten über die DataTemplate gesteuert werden.

Sangeetha
quelle
0

Das Update war für mich zu Set - Eigenschaft HorizontalAlignment="Stretch"auf ItemsPresenterinnen ScrollViewer ..

Hoffe das hilft jemandem ...

<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ć
quelle
0

Ich hatte auch das gleiche Problem, als schnelle Problemumgehung habe ich Blend verwendet, um zu bestimmen, wie viel Polsterung hinzugefügt wurde. In meinem Fall war es 12, also habe ich einen negativen Rand verwendet, um es loszuwerden. Jetzt kann jetzt alles richtig zentriert werden

Michael Ato Hutchful
quelle