programing

텍스트 블록텍스트랩핑이 랩핑

codeshow 2023. 4. 12. 22:42
반응형

텍스트 블록텍스트랩핑이 랩핑

TextBlock을 수평으로 정렬된 스택 패널 내부에 배치하면 텍스트 블록이 랩되지 않습니다.StackPanel의 사용 가능한 폭이 PositiveInfinity이기 때문인 것은 알고 있습니다만, 회피책은 없습니까?

이 샘플보다 레이아웃이 훨씬 복잡하기 때문에 스택 패널 또는 수평 방향을 제거할 수 없습니다.나는 단지 그 행동을 보이는 가장 간단한 예를 재현하려고 했을 뿐이다.

    <StackPanel Orientation="Horizontal">
        <Rectangle Width="50" Height="50" Fill="Blue" VerticalAlignment="Top" />
        <Rectangle Width="50" Height="50" Fill="Red" VerticalAlignment="Top" />
        <TextBlock TextWrapping="Wrap"
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />
    </StackPanel>

업데이트: 텍스트 블록의 너비는 동적이어야 합니다.사이즈가 변경되면 창문과 함께 흘러야 합니다.

업데이트 2: 어린이가 수평으로 배치되어야 하므로 스택 패널에 다른 요소가 추가되었습니다.

업데이트 3 (솔루션):스택 패널을 도킹 패널로 교환해 주세요.

<DockPanel>
    <DockPanel DockPanel.Dock="Top">
        <Rectangle Width="50" Height="50" Fill="Blue" VerticalAlignment="Top" DockPanel.Dock="Left" />
        <Rectangle Width="50" Height="50" Fill="Red" VerticalAlignment="Top" DockPanel.Dock="Left" />
        <TextBlock TextWrapping="Wrap"
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />
    </DockPanel>
</DockPanel>

StackPanel에서 수평 방향을 사용하고 있기 때문입니다.즉, StackPanel이 각 자식 컨트롤에 전체 폭을 제공한 다음 수평으로 배치한다는 의미입니다. 이는 경계/표시 폭을 초과한 경우에도 마찬가지입니다.TextBlock의 너비를 제한하는 것이 없기 때문에 랩되지 않습니다.

Vertical 방향으로 바꾸면 포장도 가능하지만, 그 외의 사양에 대해서는 이유가 있다고 생각합니다.어떤 레이아웃을 달성하려고 하는지 보여줄 수 있나요?

StackPanel 대신 그리드를 사용할 수 있습니다(설명한 바와 같이 내용은 제한되지 않습니다.그리드는 StackPanel보다 훨씬 더 많은 항목 레이아웃을 제어할 수 있으며 이미지가 축소된 경우 '자동' 열의 너비가 0이 됩니다.

<DockPanel>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Rectangle Width="50" Height="50" Fill="Blue" VerticalAlignment="Top" />
        <TextBlock TextWrapping="Wrap" Grid.Column="1"
            Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />
    </Grid>

</DockPanel>

이 문제에 대한 몇 가지 해결책이 있습니다.

1) 부모 너비를 텍스트 블록 너비에 바인딩합니다.(다음의 경우는 부모로서 유저 컨트롤을 고려했습니다).

<UserControl x:Class="WpfApplication1.MyWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Name="userctrl">   
    <DockPanel>
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" HorizontalAlignment="Left" >
            <TextBlock TextWrapping="Wrap" MaxWidth="{Binding ElementName=userctrl,Path=ActualWidth}"
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />

        </StackPanel>       
    </DockPanel>
</UserControl>

2) 스택 패널 대신 그리드를 사용하는 다른 솔루션

<UserControl x:Class="WpfApplication1.MyWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" Name="userctrl">   
    <DockPanel>
        <Grid DockPanel.Dock="Top" HorizontalAlignment="Left" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <TextBlock TextWrapping="Wrap" 
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />
            <TextBlock TextWrapping="Wrap" Grid.Column="1" Margin="20 0 0 0"
                Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus leo lectus, viverra ut lobortis vel, mollis eget lectus. Suspendisse laoreet consequat ultrices. Curabitur ultricies, tortor feugiat porttitor faucibus, lorem eros pretium nisl, eu ullamcorper mauris tortor sit amet augue." />

        </Grid>       
    </DockPanel>
</UserControl>

저와 같은 경우 Width를 정의했는데도 텍스트 블록이 아직 래핑되지 않은 이유가 궁금하다면.

[Width] 와 같은 값으로 [MaxWidth]를 텍스트 블록에 추가합니다.

이렇게 하면 응용 프로그램이 시작되면 Width에서 컨트롤이 커지는 것을 막을 수 있습니다.

이게 도움이 됐으면 좋겠네요!

저도 같은 문제가 있었습니다만, 제 경우는 ControlTemplate있는 texbox 스타일이 있었습니다.ControlTemplate의 Textbox로 이동하여 설정하기만 하면 됩니다.

TextWrapping="{TemplateBinding TextWrapping}"

ControlTemplate의 텍스트 상자에 내가 설정한 값을 가져옵니다.

Box List 에서 Text Box를 .
수 추가했다ScrollViewer.HorizontalScrollBarVisibility="Disabled" 및 ListBox로 »TextWrapping="Wrap"로 »

코드 샘플:

<ListBox Name="ConsoleLogs" ScrollViewer.HorizontalScrollBarVisibility="Disabled" VerticalAlignment="Top" Width="Auto" Height="227" Grid.Column="1" ItemsSource="{Binding LogItems, UpdateSourceTrigger=PropertyChanged}">
   <ListBox.ItemTemplate >
      <DataTemplate>
         <DockPanel >
             <TextBlock Text="{Binding}" TextWrapping="Wrap"/>
         </DockPanel>
      </DataTemplate>
   </ListBox.ItemTemplate>

출처: WPF의 DataTemplate: 텍스트 랩핑 방법

언급URL : https://stackoverflow.com/questions/6625177/textblock-textwrapping-not-wrapping

반응형