Buộc TextBlock nằm trong WPF ListBox


94

Tôi có một hộp danh sách WPF hiển thị các tin nhắn. Nó chứa một hình đại diện ở phía bên trái và tên người dùng và tin nhắn xếp chồng lên nhau theo chiều dọc bên phải của hình đại diện. Bố cục ổn cho đến khi văn bản tin nhắn chuyển thành từ, nhưng thay vào đó tôi nhận được một thanh cuộn ngang trên hộp danh sách.

Tôi đã lên Google và tìm giải pháp cho các vấn đề tương tự, nhưng không có giải pháp nào trong số đó hoạt động.

<ListBox HorizontalContentAlignment="Stretch"  ItemsSource="{Binding Path=FriendsTimeline}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Border BorderBrush="DarkBlue" BorderThickness="3" CornerRadius="2" Margin="3" >
                    <Image Height="32" Width="32"  Source="{Binding Path=User.ProfileImageUrl}"/>
                </Border>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding Path=User.UserName}"/>
                    <TextBlock Text="{Binding Path=Text}" TextWrapping="WrapWithOverflow"/> <!-- This is the textblock I'm having issues with. -->
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Câu trả lời:


132

Nội dung của TextBlockcó thể được gói bằng tài sản TextWrapping. Thay vì StackPanel, hãy sử dụng DockPanel/ Grid. Một điều nữa - hãy đặt thuộc ScrollViewer.HorizontalScrollBarVisibilitytính thành Disabledgiá trị cho ListBox.

Cập nhật Hiddenđể Disableddựa trên nhận xét của Matt. Cảm ơn Matt.


38
Tôi nghĩ bạn cần đặt ScrollViewer.HorizontalScrollBarVisibility thành "Disabled" chứ không phải "Hidden" - nếu không ListBox vẫn sẽ cố cuộn theo chiều ngang, bạn sẽ không thấy thanh cuộn.
Matt Hamilton

9

Sự cố có thể không nằm trong ListBox. TextBlock sẽ không bọc, nếu một trong các điều khiển cha cung cấp đủ không gian để nó không cần phải bọc. Điều này có thể do điều khiển ScrollViewer gây ra.


1
Cảm ơn! trong trường hợp của tôi, vô hiệu hóa cuộn ngang trong listview đã khắc phục sự cố ScrollViewer.HorizontalScrollBarVisibility = "Disabled"
Ateik

2

Nếu bạn muốn ngăn TextBlock phát triển và bạn muốn nó vừa với kích thước của hộp danh sách, bạn nên đặt chiều rộng của nó một cách rõ ràng.

Để thay đổi nó một cách động, nó không có nghĩa là một giá trị cố định, nhưng bạn cần phải liên kết nó với phần tử cha thích hợp của nó trong cây trực quan. Bạn có thể có một cái gì đó như thế này:

<ListBox ItemsSource="{Binding MyItems}" Name="MyListBox">

  <ListBox.Resources>
    <Style TargetType="ListBoxItem">
      <Setter Property="Width" 
              Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ScrollContentPresenter}, Path=ActualWidth}" />
    </Style>
  </ListBox.Resources>

  <ListBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Title}" TextWrapping="Wrap" />
    </DataTemplate>
  </ListBox.ItemTemplate>

</ListBox>

Nếu nó không hoạt động, hãy cố gắng tìm các phần tử thích hợp (phải được liên kết với cái gì) với Live Visual Tree trong Visual Studio.

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.