วิธีการรับกล่องรายการ ItemTemplate เพื่อยืดความกว้างเต็มของกล่องรายการในแนวนอน


356

ฉันต้องการให้ ListItems ขยายพื้นหลังสีส้มแบบเต็มความกว้างของกล่องรายการ

ขณะนี้พวกเขามีความกว้างเท่ากับ FirstName + LastName

ฉันได้ตั้งค่าทุกองค์ประกอบที่สามารถทำได้: HorizontalAlignment = "Stretch"

ฉันต้องการพื้นหลังของ ListboxItems เพื่อขยายเมื่อผู้ใช้ยืดกล่องรายการออกดังนั้นฉันไม่ต้องการใส่ค่าสัมบูรณ์

ฉันต้องทำอย่างไรเพื่อให้สีพื้นหลังของ ListBoxItems เติมความกว้างของกล่องรายการ

<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 คุณรู้วิธีแก้ปัญหาเมื่อคุณมีรายการกล่องรายการที่กำหนดเองหรือไม่? พบปัญหาด้วยตัวเอง
eoldre

11
อันที่จริงวิธีการแก้ปัญหานี้ไม่ทำงานใน Silverlight ด้วยเหตุผลบางอย่าง การแก้ปัญหาของ Gabriel ในทางกลับกันทำ
TimothyP

6
สิ่งนี้ใช้ไม่ได้กับตัวควบคุม WinRT ListView ฉันได้ลองไปแล้ว
uSeRnAmEhAhAhAhAhA

3
ใช้งานได้ดีกับรายการที่กำหนดเอง (Windows ไม่ใช่ Silverlight) เพียง แต่ต้องระมัดระวังโดยอัตโนมัติเมื่อเขียน xaml หากคุณเขียน "Horizo ​​nt .. " คุณจะได้รับ "HorizontalAlignment" ไม่ใช่ "HorizontalContentAlignment" การเลือกคำแนะนำแรกนั้นค่อนข้างง่ายเนื่องจากทั้งคู่ใช้ "ยืด"
Jarle Bjørnbeth

1
รายการที่กำหนดเองใช้งานได้สำหรับฉันถ้าฉันตั้งความกว้างของรายการที่กำหนดเองเป็นอัตโนมัติ
Lensflare

646

ฉันพบวิธีแก้ไขปัญหาอื่นที่นี่เนื่องจากฉันพบทั้งสองโพสต์ ...

นี่คือคำตอบจาก Myles:

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

สิ่งนี้ใช้ได้สำหรับฉัน


@CameronMacFarland สาเหตุของ Silverlight อย่างน้อยก็ในกรณีของฉันเพราะเจ้าหน้าที่ IT Admin ไม่สามารถหาวิธีปรับใช้แอพ WPF / Winform โดยใช้ Active Directory และเราต้องการสถานการณ์การปรับใช้ที่สะอาดซึ่งไม่ได้ขึ้นอยู่กับเรา การปรับปรุง
Richard B

@RichardB lol ความคิดเห็นของฉันกำกับมากขึ้นที่ silverlight เพราะเหตุใด Silverlight จึงต้องแตกต่างและมีเทมเพลตที่แตกหักเมื่อเทียบกับ WPF
Cameron MacFarland

@CameronMacFarland อ่า ... ไม่ต้องกังวล หลังจากทำแอพ Silverlight และการดิ้นรนกับไฟล์ ServiceReferences.ClientConfig ฉันตั้งค่าว่าฉันจะหลีกเลี่ยง (เช่นกาฬโรค) ที่เคยพัฒนาแอปพลิเคชัน Silverlight อีกครั้ง มันเป็นความคิดที่ยอดเยี่ยม แต่ก็ไม่น่าประทับใจ
Richard B

1
ในการทำให้สิ่งนี้ทำงานกับเทมเพลตข้อมูลภายใน listView: <ListView.ItemContainerStyle> <Style TargetType = "ListViewItem"> <Setter Property = "HorizontalContentAlignment" Value = "Stretch"> </Setter> </Style> </ ListView> .ItemContainerStyle>
Christopher Cook

ข้อผิดพลาด: ข้อผิดพลาดพา ธ BindingExpression: ไม่พบคุณสมบัติ 'ความกว้าง' ใน Project.CustomElement, Project.WindowsPhone, เวอร์ชัน = 1.0.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = null ' BindingExpression: Path = 'Width' DataItem = Project.CustomElement, Project.WindowsPhone, เวอร์ชัน = 1.0.0.0, วัฒนธรรม = เป็นกลาง, PublicKeyToken = null '; องค์ประกอบเป้าหมายคือ 'Windows.UI.Xaml.Controls.Grid' (ชื่อ = 'null'); คุณสมบัติเป้าหมายคือ 'ความกว้าง' (พิมพ์ 'คู่')
Black Cid

72

ถ้ารายการของคุณมีความกว้างกว่าListBoxคำตอบอื่น ๆ ที่นี่จะไม่ช่วย: รายการในที่ยังคงกว้างกว่าItemTemplateListBox

การแก้ไขที่ใช้งานได้สำหรับฉันคือการปิดการใช้งานแถบเลื่อนแนวนอนซึ่งแน่นอนว่ายังบอกถึงคอนเทนเนอร์ของไอเท็มเหล่านั้นทั้งหมดที่จะคงความกว้างเท่ากับกล่องรายการ

ดังนั้นการแก้ไขแบบรวมเพื่อให้ได้รับรายการกล่องรายการที่มีความกว้างเท่ากับกล่องรายการไม่ว่าจะมีขนาดเล็กลงและต้องยืดหรือกว้างขึ้นและต้องมีการห่อเป็นดังนี้:

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

( เครดิตสำหรับแนวคิดแถบเลื่อน )


0

เนื่องจากเส้นขอบใช้สำหรับลักษณะที่ปรากฏเท่านั้นคุณสามารถใส่ลงในกล่องควบคุมรายการของกล่องรายการและแก้ไขคุณสมบัติได้ ใน ItemTemplate คุณสามารถวางเฉพาะ StackPanel และ TextBlock ด้วยวิธีนี้รหัสยังคงสะอาดเหมือนในลักษณะของการควบคุมจะถูกควบคุมผ่าน ControlTemplate และข้อมูลที่จะแสดงจะถูกควบคุมผ่าน DataTemplate


0

การแก้ไขสำหรับฉันคือการตั้งค่าคุณสมบัติHorizontalAlignment="Stretch"ในItemsPresenterภายในScrollVieweR ..

หวังว่านี่จะช่วยใครซักคน ...

<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 ดังนั้นฉันจึงใช้ระยะขอบติดลบเพื่อกำจัดมัน ตอนนี้ทุกอย่างสามารถเป็นศูนย์กลางได้อย่างถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.