WPF文本框自动换行

15

我正在尝试弄清楚如何让文本框自动换行,但情况并不完全像典型的“无法换行”场景。我的文本框包含在一个DataTemplate中,该DataTemplate用于Telerik RadTabControl实例内部(使用ContentTemplatePresenter确定要显示的视图),DataTemplate的XAML代码如下:

<DataTemplate x:Key="NotesTemplate">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBlock Text="Use the box below to record any general notes associated with this item." Style="{StaticResource Default}" />
        <TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" GridRow="1" Margin="20" Text="{Binding Notes, UpdateSourceTrigger=PropertyChanged}" />
     </Grid>
</DataTemplate>

我的意思是,它不属于普通的“不换行”情况,因为在我将视图更改为可调整大小以支持应用程序将运行的各种屏幕尺寸之前,它可以换行。当我这样做时,文本框停止了换行,因为(可能是)当用户输入一些内容时,文本框会说“我需要更多的空间”,所以父级会满足并且盒子无限制地继续向右延伸(虽然视图获取滚动条)。我尝试使用Binding / RelativeSource设置MaxWidth,但由于父级是特定设计的来增长,所以这种方法行不通。我需要发生的是该框的宽度应为其包含父项的VisibleWidth。也就是说,如果窗口本身是1024x768,则文本框的MaxWidth应为1024,此后的任何文本都将自动换行,但如果窗口增长到1280x1024,则框现在应为1280,文本将相应地换行。我尝试了这种绑定表达式的方案,但没有成功:

MaxWidth="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Path=ActualWidth}"

窗口大小本身并不会增长,因此如果我可以获得窗口的宽度(减去某个特定量以覆盖TabControl中的选项卡宽度),我认为那将起作用。

有什么想法吗?


最终通过另一个 SO 问题找到了最佳结果:https://dev59.com/83RC5IYBdhLWcg3wK92V。 - Scott Salyer
1个回答

20

虽然视图会出现滚动条

禁用水平的scrollView,这样就会强制换行。您可以在TextBox本身上禁用它,也可以在包装的Grid上禁用它。

<DataTemplate x:Key="NotesTemplate">
    <Grid ScrollViewer.HorizontalScrollBarVisibility="Disabled">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBlock Text="Use the box below to record any general notes associated with this item." Style="{StaticResource Default}" />
        <TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" Grid.Row="1" Margin="20" Text="{Binding Notes, UpdateSourceTrigger=PropertyChanged}" />
     </Grid>
</DataTemplate>

1
那个方法没起作用,但是这个 Stack Overflow 的链接让我接近成功了 99%:https://dev59.com/83RC5IYBdhLWcg3wK92V。唯一我不确定的是,如果将窗口重新调整为较小的分辨率,文本框是否会保留原始宽度,但我不确定这对我是否有影响,而且我倾向于没有影响。 - Scott Salyer
@digitall:我刚在这里运行了代码,它正常工作(只有网格)。也许其他包装控件搞砸了它。 - MichaelS
在一个有8列的网格中(其中一列设置为自动),一个具有columnspan="8"的文本框,换行不起作用,文本框会自动增加其大小 ;( - lunair
如果有人想知道,这个修复方法也适用于由ListBox而不是DataGrid创建滚动条。或者至少对我来说是有效的。 - Adrian Ratnapala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接