ListBox tam genişliğini yatay olarak uzatmak için bir ListBox ItemTemplate nasıl edinilir?


356

ListItems turuncu arka plan ile Listbox tam genişliğini uzatmak istiyorum.

Şu anda sadece FirstName + LastName kadar genişler.

Yapabildiğim her elemanı ayarladım: HorizontalAlignment = "Stretch".

Mutlak değerler koymak istemiyorum böylece kullanıcı Listbox uzanır gibi ListboxItems arka planını genişletmek istiyorum.

ListBoxItems arka plan rengini ListBox genişliğini doldurmak için ne yapmam gerekir?

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

Yanıtlar:


468

Eminim bu bir kopyadır, ancak aynı cevabı içeren bir soru bulamıyorum.

HorizontalContentAlignment="Stretch"ListBox'ınıza ekleyin . Hile yapmalı. Otomatik tamamlamaya dikkat edin, çünkü HorizontalAlignmentyanlışlıkla almak çok kolaydır .


1
@ Agile Jedi, özel ListBox Öğeleriniz olduğunda bir çözüm biliyor musunuz? Bu konuya kendim giriyorum.
eoldre

11
Aslında bu çözüm bir sebepten ötürü Silverlight'ta çalışmaz. Öte yandan Gabriel'in çözümü
TimothyP

6
Bu, WinRT ListView denetimlerinde çalışmaz. Zaten denedim.
14'te

3
Bu, özel listelerde (Windows, Silverlight değil) iyi çalışır, sadece xaml yazarken otomatik tamamlamaya dikkat edin. "Horiz .." yazarsanız "HorizontalContentAlignment" değil, "HorizontalAlignment" alırsınız. Her ikisi de "Stretch" kullandığından ilk öneriyi seçmek oldukça kolaydır.
Jarle Bjørnbeth

1
Özel öğe genişliğini otomatik olarak ayarlarsam özel öğeler benim için çalışır.
Lensflare

646

Her iki yazıyla da karşılaştığım için burada başka bir çözüm buldum ...

Myles cevabından:

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

Bu benim için çalıştı.


@CameronMacFarland Silverlight'ın nedeni, en azından benim durumumda, BT Yöneticisi personelinin WPF / Winform uygulamalarının Active Directory kullanarak nasıl dağıtılacağını anlayamaması ve bize bağlı olmayan temiz bir dağıtım senaryosu istedik. güncellemeler.
Richard B

@RichardB lol Benim yorumum silverlight'a daha fazla yönelikti, çünkü silverlight neden farklı olmalı ve WPF'ye kıyasla kırık bir şablona sahip olmalı.
Cameron MacFarland

@CameronMacFarland ah ... endişelenme. Bir Silverlight uygulaması yaptıktan ve ServiceReferences.ClientConfig dosyası ile mücadele ettikten sonra, (veba gibi) tekrar başka bir Silverlight uygulaması geliştirmekten kaçınacağım. Harika bir fikirdi, ama etkileyici değil.
Richard B

1
Bunun bir listView içindeki bir veri şablonu için çalışmasını sağlamak için: <ListView.ItemContainerStyle> <Style TargetType = "ListViewItem"> <Setter Property = "HorizontalContentAlignment" Value = "Stretch"> </Setter> </Style> </ ListView .ItemContainerStyle>
Christopher Cook

Hata: BindingExpression yol hatası: Project.CustomElement, Project.WindowsPhone, Sürüm = 1.0.0.0, Kültür = nötr, PublicKeyToken = null öğesinde 'Genişlik' özelliği bulunamadı. BindingExpression: Path = 'Width' DataItem = Project.CustomElement, Project.WindowsPhone, Sürüm = 1.0.0.0, Kültür = nötr, PublicKeyToken = null '; hedef öğe 'Windows.UI.Xaml.Controls.Grid' (Name = 'null'); target özelliği 'Genişlik' ('Çift' yazın)
Black Cid

72

Senin öğeler ise daha geniş daha ListBoxbaşka cevaplar burada olmaz yardım: öğeleri ItemTemplatedaha geniş kalır ListBox.

Benim için çalışan düzeltme, görünüşe göre, tüm bu öğelerin kaplarına yalnızca liste kutusu kadar geniş kalmasını söyleyen yatay kaydırma çubuğunu devre dışı bırakmaktı.

Bu nedenle, liste kutusu kadar geniş olan ListBox öğelerini almak için birleştirilmiş düzeltme, daha küçük ve gerilmesi veya daha geniş olması ve kaydırılması gerekir:

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

( kaydırma çubuğu fikri kredileri )


0

Kenarlık yalnızca görsel görünüm için kullanıldığından, ListBoxItem'in ControlTemplate'ine koyabilir ve oradaki özellikleri değiştirebilirsiniz. ItemTemplate, yalnızca StackPanel ve TextBlock yerleştirebilirsiniz. Bu şekilde, kodun görünümü temiz kalır, çünkü kontrolün görünümü ControlTemplate üzerinden kontrol edilecek ve gösterilecek veriler DataTemplate üzerinden kontrol edilecektir.


0

Benim için düzeltme seti özelliğine oldu HorizontalAlignment="Stretch"üzerindeki ItemsPresenterScrollViewer ..

Umarım bu birine yardımcı olur ...

<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

Aynı sorunla karşılaştım, hızlı bir çözüm olarak, ne kadar dolgu eklendiğini belirlemek için karışımı kullandım. Benim durumumda 12 yaşındaydı, bu yüzden ondan kurtulmak için negatif bir marj kullandım. Artık her şey düzgün bir şekilde ortalanabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.