Làm cách nào để có được một ListBox ItemTemplate để kéo dài theo chiều ngang toàn bộ chiều rộng của ListBox?


356

Tôi muốn có ListItems để mở rộng với nền màu cam của chúng toàn bộ chiều rộng của Listbox.

Hiện tại chúng chỉ rộng bằng FirstName + LastName.

Tôi đã đặt mọi yếu tố có thể thành: Ngang ngang = "Kéo dài".

Tôi muốn nền của ListboxItems mở rộng khi người dùng mở rộng Listbox vì vậy tôi không muốn đặt các giá trị tuyệt đối.

Tôi phải làm gì để màu nền của ListBoxItems lấp đầy chiều rộng của 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>

Câu trả lời:


468

Tôi chắc chắn đây là một bản sao, nhưng tôi không thể tìm thấy một câu hỏi có cùng câu trả lời.

Thêm HorizontalContentAlignment="Stretch"vào ListBox của bạn. Điều đó sẽ làm các trick. Chỉ cần cẩn thận với tự động hoàn thành bởi vì nó rất dễ bị HorizontalAlignmentnhầm lẫn.


1
@ Agile Jedi, bạn có biết giải pháp nào khi bạn có các mục ListBox tùy chỉnh không? Chạy vào vấn đề đó bản thân mình.
eoldre

11
Trên thực tế, giải pháp này không hoạt động trong Silverlight vì một số lý do. Mặt khác, giải pháp của Gabriel cũng vậy
TimothyP

6
Điều này không hoạt động trên các điều khiển WinRT ListView. Tôi đã thử nó rồi.
uSeRnAmEhAhAhAhA

3
Điều này hoạt động tốt trên danh sách tùy chỉnh (Windows, không phải Silverlight), chỉ cần cẩn thận với tự động hoàn thành khi viết xaml. Nếu bạn viết "Chân trời ..", bạn sẽ nhận được "Ngang ngang" chứ không phải "Ngang ngang". Thật dễ dàng để chọn đề xuất đầu tiên, vì cả hai đều đang sử dụng "Kéo dài".
Jarle Bjørnbeth

1
Các mục tùy chỉnh sẽ hoạt động với tôi nếu tôi đặt chiều rộng của mục tùy chỉnh thành tự động.
Lensflare 9/12/2015

646

Tôi tìm thấy một giải pháp khác ở đây , vì tôi đã chạy vào cả hai bài ...

Đây là từ câu trả lời của Myles:

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

Điều này làm việc cho tôi.


@CameronMacFarland Lý do cho Silverlight, ít nhất là trong trường hợp của tôi, là bởi vì nhân viên Quản trị CNTT không thể tìm ra cách triển khai các ứng dụng WPF / Winform bằng Active Directory và chúng tôi muốn có một kịch bản triển khai rõ ràng không phụ thuộc vào chúng tôi các bản cập nhật.
Richard B

@RichardB lol Nhận xét của tôi hướng nhiều hơn vào silverlight, vì tại sao Silverlight phải khác biệt và có một mẫu bị hỏng so với WPF.
Cameron MacFarland

@CameronMacFarland ah ... không phải lo lắng. Sau khi thực hiện ứng dụng Silverlight và đấu tranh với tệp ServiceReferences.ClientConfig, tôi đặt ra rằng tôi sẽ tránh (như bệnh dịch hạch) một lần nữa phát triển ứng dụng Silverlight khác. Đó là một ý tưởng tuyệt vời, nhưng chỉ không ấn tượng.
Richard B

1
Để làm việc này cho một mẫu dữ liệu trong listView: <ListView.ItemContainerStyle> <Style TargetType = "ListViewItem"> <Setter Property = "verticalContentAlocate" Value = "Stretch"> </ Setter> </ Style> </ ListView .ItemContainerStyle>
Christopher Cook

Lỗi: Lỗi đường dẫn BindingExpression: Không tìm thấy thuộc tính 'Width' trên Project.CustomEuity, Project.WindowsPhone, Version = 1.0.0.0, Culture = trung tính, PublicKeyToken = null '. BindingExpression: Path = 'Width' DataItem = Project.CustomEuity, Project.WindowsPhone, Version = 1.0.0.0, Culture = trung tính, PublicKeyToken = null '; phần tử đích là 'Windows.UI.Xaml.Controls.Grid' (Name = 'null'); thuộc tính mục tiêu là 'Width' (loại 'Double')
Black Cid

72

Nếu các mục của bạn rộng hơn ListBox, các câu trả lời khác ở đây sẽ không có ích: các mục trong phần ItemTemplatecòn lại rộng hơn ListBox.

Cách khắc phục có hiệu quả đối với tôi là vô hiệu hóa thanh cuộn ngang, rõ ràng, cũng cho biết thùng chứa của tất cả các mặt hàng đó chỉ còn rộng như hộp danh sách.

Do đó, sửa chữa kết hợp để có được các mục ListBox rộng bằng hộp danh sách, cho dù chúng nhỏ hơn và cần kéo dài, hoặc rộng hơn và cần gói, như sau:

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

( tín dụng cho ý tưởng thanh cuộn )


0

Vì đường viền được sử dụng chỉ để xuất hiện trực quan, bạn có thể đặt nó vào ControlTemplate của ListBoxItem và sửa đổi các thuộc tính ở đó. Trong ItemTemplate, bạn chỉ có thể đặt StackPanel và TextBlock. Theo cách này, mã cũng vẫn sạch, vì sự xuất hiện của điều khiển sẽ được điều khiển thông qua ControlTemplate và dữ liệu được hiển thị sẽ được kiểm soát thông qua DataTemplate.


0

Cách khắc phục đối với tôi là đặt thuộc tính HorizontalAlignment="Stretch"vào ItemsPresenterbên trong ScrollViewer ..

Hy vọng điều này sẽ giúp ai đó ...

<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

Tôi cũng gặp vấn đề tương tự, như một cách giải quyết nhanh chóng, tôi đã sử dụng hỗn hợp để xác định số lượng phần đệm được thêm vào. Trong trường hợp của tôi là 12, vì vậy tôi đã sử dụng lề âm để loại bỏ nó. Bây giờ mọi thứ có thể được tập trung đúng cách

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.