Come ottenere un ItemTemplate ListBox per allungare orizzontalmente l'intera larghezza di ListBox?


356

Voglio che ListItems estenda con il loro sfondo arancione l'intera larghezza della Listbox.

Attualmente sono larghi solo quanto il nome e il cognome.

Ho impostato tutti gli elementi che posso su: HorizontalAlignment = "Stretch".

Voglio che lo sfondo di ListboxItems si espanda mentre l'utente allunga la Listbox in modo da non voler inserire valori assoluti.

Cosa devo fare in modo che il colore di sfondo di ListBoxItems riempia la larghezza di 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>

Risposte:


468

Sono sicuro che questo è un duplicato, ma non riesco a trovare una domanda con la stessa risposta.

Aggiungi HorizontalContentAlignment="Stretch"al tuo ListBox. Questo dovrebbe fare il trucco. Fai solo attenzione con il completamento automatico perché è così facile ottenere HorizontalAlignmentper errore.


1
@ Agile Jedi, conosci una soluzione quando hai articoli ListBox personalizzati? Incontrando me stesso quel problema.
eoldre,

11
In realtà questa soluzione non funziona in Silverlight per qualche motivo. La soluzione di Gabriel invece lo fa
Timoteo,

6
Questo non funziona con i controlli ListView di WinRT. L'ho già provato.
uSeRnAmEhAhAhAhAhA

3
Funziona bene su elenchi personalizzati (Windows, non Silverlight), fai solo attenzione con il completamento automatico quando scrivi xaml. Se scrivi "Horiz .." otterrai "HorizontalAlignment" e non "HorizontalContentAlignment". È abbastanza facile selezionare il primo suggerimento, poiché entrambi utilizzano "Stira".
Jarle Bjørnbeth,

1
Gli articoli personalizzati funzionano per me se imposto la larghezza dell'oggetto personalizzato su auto.
Lensflare,

646

Ho trovato un'altra soluzione qui , dal momento che mi sono imbattuto in entrambi i post ...

Questo è dalla risposta Myles:

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

Questo ha funzionato per me.


@CameronMacFarland Il motivo di Silverlight, almeno nel mio caso, è perché il personale dell'amministratore IT non è riuscito a capire come distribuire app WPF / Winform utilizzando Active Directory e volevamo uno scenario di distribuzione pulito che non dipendesse da noi. gli aggiornamenti.
Richard B,

@RichardB lol Il mio commento è stato più diretto su silverlight, come nel perché Silverlight deve essere diverso e avere un modello rotto rispetto a WPF.
Cameron MacFarland,

@CameronMacFarland ah ... nessuna preoccupazione. Dopo aver fatto un'app Silverlight e aver lottato con il file ServiceReferences.ClientConfig, ho deciso che eviterò (come la peste) di non sviluppare mai un'altra applicazione Silverlight. È stata una bella idea, ma non impressionante.
Richard B,

1
Per farlo funzionare per un modello di dati all'interno di un elenco Visualizza: <ListView.ItemContainerStyle> <Style TargetType = "ListViewItem"> <Setter Property = "HorizontalContentAlignment" Value = "Stretch"> </Setter> </Style> </ ListView .ItemContainerStyle>
Christopher Cook,

Errore: errore del percorso BindingExpression: proprietà 'Width' non trovata su Project.CustomElement, Project.WindowsPhone, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null '. BindingExpression: Path = 'Width' DataItem = Project.CustomElement, Project.WindowsPhone, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null '; l'elemento target è 'Windows.UI.Xaml.Controls.Grid' (Name = 'null'); la proprietà target è 'Width' (tipo 'Double')
Black Cid

72

Se i tuoi articoli sono più larghi di ListBox, le altre risposte qui non ti aiuteranno: gli articoli in ItemTemplaterimangono più larghi di ListBox.

La soluzione che ha funzionato per me è stata la disabilitazione della barra di scorrimento orizzontale, che, a quanto pare, dice anche al contenitore di tutti quegli elementi di rimanere largo quanto la casella di riepilogo.

Quindi la correzione combinata per ottenere elementi ListBox larghi quanto la casella di riepilogo, sia che siano più piccoli e che debbano essere stirati, sia più ampi e che abbiano bisogno di essere avvolti, è la seguente:

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

( crediti per l'idea della barra di scorrimento )


0

Poiché il bordo viene utilizzato solo per l'aspetto visivo, è possibile inserirlo nel ControlTemplate di ListBoxItem e modificarne le proprietà. In ItemTemplate, è possibile posizionare solo StackPanel e TextBlock. In questo modo, anche il codice rimane pulito, poiché l'aspetto del controllo verrà controllato tramite ControlTemplate e i dati da mostrare verranno controllati tramite DataTemplate.


0

La correzione per me è stato quello di insieme di proprietà HorizontalAlignment="Stretch"sul ItemsPresenterall'interno ScrollViewer ..

Spero che questo aiuti qualcuno ...

<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

Ho anche avuto lo stesso problema, come soluzione rapida, ho usato il blend per determinare quanta imbottitura veniva aggiunta. Nel mio caso erano 12, quindi ho usato un margine negativo per liberarmene. Ora tutto può ora essere centrato correttamente

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.