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

の内容は、TextBlockpropertyを使用してラップできますTextWrapping。の代わりに/をStackPanel使用します。もう1つ、プロパティをの値に設定します。DockPanelGridScrollViewer.HorizontalScrollBarVisibilityDisabledListBox

マットからのコメントHiddenDisabled基づいて更新されました。マットに感謝します。


38
ScrollViewer.Horizo​​ntalScrollBarVisibilityを "Hidden"ではなく "Disabled"に設定する必要があると思います。それ以外の場合、ListBoxは水平方向にスクロールしようとしますが、スクロールバーは表示されません。
Matt Hamilton、

9

問題はリストボックスにない可能性があります。親コントロールの1つが十分なスペースを提供する場合、TextBlockはラップされないため、ラップする必要はありません。これは、ScrollViewerコントロールが原因である可能性があります。


1
ありがとう!私の場合、リストビューで水平スクロールを無効にすると、問題が修正されましたScrollViewer.Horizo​​ntalScrollBarVisibility = "Disabled"
Ateik

2

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>

機能しない場合は、Visual Studioのライブビジュアルツリーで適切な要素(何にバインドする必要があるか)を見つけてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.