XAML 在TextWrapping文本框中显示垂直滚动条

x6yk4ghg  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(189)

我有一个WPF UserControl。在其中,我有一个Grid,它只包含一行和几列。有一个TextBox,我使用以下样式将它的TextWrapping设置为Wrap

<Style x:Key="TextBlockStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Background" Value="{x:Null}" />
    <Setter Property="BorderBrush" Value="{x:Null}" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="Padding" Value="0" />
    <Setter Property="IsReadOnly" Value="True" />
    <Setter Property="IsTabStop" Value="False" />
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="TextWrapping" Value="Wrap" />
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Background" Value="{x:Null}" />
        </Trigger>
    </Style.Triggers>
</Style>

Grid

<Grid Height="auto" >
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto"/>
        <ColumnDefinition Width="auto"/>
        <ColumnDefinition Width="auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

        <TextBox Grid.Column="1" 
                 Style="{StaticResource TextBlockStyle}"
                 VerticalScrollBarVisibility="Auto"
                 HorizontalAlignment="Left"
                 Margin="5"
                 Text="{Binding Path=Text}"
                 Foreground="{Binding Path=ForegroundColor}">
        </TextBox>
</Grid>

所发生的是垂直滚动条从未显示。相反,文本被垂直剪切掉。

2g32fytz

2g32fytz1#

问题是TextBox的行和列定义使用Auto作为大小:
如果将子元素添加到Grid中的列,并且该列的Width属性设置为Auto,则子元素的度量将不受限制。如果使用ScrollViewer,则此行为可能会阻止显示水平滚动条,因为子元素的度量是无边界的。出于显示的目的,子元素将被剪切而不是滚动
这正是你的例子。通过无限的宽度,TextBox水平扩展,直到它适合它的内容,这是远远超过可用(可见)的空间,所以其余的被切断。同样适用于无限的高度,如果你只固定宽度。因此,所有的内容在技术上适合,没有滚动条显示。
在这种情况下,您应该使用星星大小调整来调整TextBox在剩余空间中的大小。
在网格中定义的列和行可以利用星星调整大小来按比例分配剩余空间。
这样,它的大小就受到剩余空间的限制,如果没有足够的空间容纳整个文本,滚动条就会显示出来。这里我只是用*替换了Auto的大小,这样就可以了:

<Grid.RowDefinitions>
   <RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
   <ColumnDefinition Width="auto"/>
   <ColumnDefinition Width="*"/>
   <ColumnDefinition Width="auto"/>
   <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

当然,您必须将其转换为适合您的布局要求。

相关问题