WPF Listbox에서 랩을 랩핑하도록 강제 텍스트 블록
문제
메시지를 표시하는 WPF ListBox가 있습니다. 여기에는 왼쪽에 아바타가 포함되어 있으며 사용자 이름과 메시지는 아바타 오른쪽에 수직으로 쌓여 있습니다. 레이아웃은 메시지 텍스트가 Word Wrap이어야 할 때까지 괜찮지 만 대신 ListBox에 수평 스크롤 막대가 나타납니다.
나는 유사한 문제에 대한 솔루션을 찾아서 찾았지만 그중 어느 것도 효과가 없었습니다.
<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>
해결책
내용 TextBlock
속성을 사용하여 포장 할 수 있습니다 TextWrapping
. 대신에 StackPanel
, 사용 DockPanel
/Grid
. 한 가지 더 - 세트 ScrollViewer.HorizontalScrollBarVisibility
속성 Disabled
에 대한 가치 ListBox
.
업데이트되었습니다 Hidden
에게 Disabled
Matt의 의견을 기반으로합니다. 감사합니다 Matt.
다른 팁
문제는 ListBox에 없을 수 있습니다. 부모 컨트롤 중 하나가 충분한 공간을 제공하여 포장 할 필요가 없도록 텍스트 블록이 랩되지 않습니다. 이것은 스크롤 뷰어 제어로 인해 발생할 수 있습니다.
TextBlock이 성장하는 것을 방지하고 ListBox의 크기에 맞는 경우 너비의 너비를 명시 적으로 설정해야합니다.
동적으로 변경하려면 고정 값이 아니지만 시각적 트리의 적절한 부모 요소에 바인딩해야합니다. 다음과 같은 것을 가질 수 있습니다.
<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>
작동하지 않으면 적절한 요소를 찾으십시오. 라이브 비주얼 트리 Visual Studio에서.