บังคับให้ TextBlock รวมอยู่ใน WPF ListBox


94

ฉันมีกล่องรายการ WPF ที่แสดงข้อความ มีรูปประจำตัวอยู่ทางด้านซ้ายและชื่อผู้ใช้และข้อความซ้อนกันในแนวตั้งทางด้านขวาของรูปประจำตัว เค้าโครงใช้ได้ดีจนกระทั่งข้อความควรตัดเป็นคำ แต่ฉันจะได้แถบเลื่อนแนวนอนบนกล่องรายการแทน

ฉันได้ใช้ Google และพบวิธีแก้ปัญหาที่คล้ายกัน แต่ไม่มีวิธีใดได้ผล

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

คำตอบ:


132

เนื้อหาของสามารถห่อใช้ทรัพย์สินTextBlock TextWrappingแทนที่จะStackPanelใช้DockPanel/ Grid. อีกอย่างหนึ่ง - ตั้งค่าScrollViewer.HorizontalScrollBarVisibilityคุณสมบัติเป็นDisabledค่าสำหรับListBox.

Updated HiddenจะDisabledอยู่บนพื้นฐานของความคิดเห็นจากแมตต์ ขอบคุณ Matt


38
ฉันคิดว่าคุณต้องตั้งค่า ScrollViewer.HorizontalScrollBarVisibility เป็น "Disabled" แทนที่จะเป็น "Hidden" มิฉะนั้น ListBox จะยังคงพยายามเลื่อนในแนวนอนคุณจะไม่เห็นแถบเลื่อน
Matt Hamilton

9

ปัญหาอาจไม่อยู่ในกล่องรายการ TextBlock จะไม่ห่อหุ้มหากหนึ่งในตัวควบคุมหลักมีพื้นที่เพียงพอดังนั้นจึงไม่จำเป็นต้องตัด ซึ่งอาจเกิดจากตัวควบคุม ScrollViewer


1
ขอบคุณ! ในกรณีของฉันการปิดใช้งานการเลื่อนแนวนอนใน listview แก้ไขปัญหา ScrollViewer.HorizontalScrollBarVisibility = "Disabled"
Ateik

3

หากคุณต้องการป้องกันไม่ให้ TextBlock ขยายใหญ่ขึ้นและคุณต้องการให้มันพอดีกับขนาดของกล่องรายการคุณควรกำหนดความกว้างของมันอย่างชัดเจน

ในการเปลี่ยนแปลงแบบไดนามิกหมายความว่าไม่ใช่ค่าฟิกซ์ แต่คุณต้องเชื่อมโยงกับองค์ประกอบหลักที่เหมาะสมในแผนผังภาพ คุณสามารถมีสิ่งนี้:

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

หากไม่ได้ผลให้พยายามค้นหาองค์ประกอบที่เหมาะสม (ซึ่งจะต้องเชื่อมโยงกับสิ่งที่) ด้วยLive Visual Treeใน Visual Studio

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