【问题标题】:MinLines and MaxLines on TextBox not workingTextBox 上的 MinLines 和 MaxLines 不起作用
【发布时间】:2020-12-14 14:28:33
【问题描述】:

谁能解释为什么下面的 TextBox 最初不显示为 3 行高?它显示 1 行高,然后在我开始输入文本时调整为 3。

编辑:这里还有一些表格

<Window x:Class="MyNamespace.Views.DetailsView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:MV="clr-namespace:MyNamespace.Views"
    xmlns:prop="clr-namespace:MyNamespace.Properties"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    MV:DialogCloser.DialogResult="{Binding Path=DialogResult, Mode=TwoWay}"
    Background="{StaticResource {x:Static SystemColors.ControlBrushKey}}" 
    Title="{Binding Source={x:Static prop:Resources.MyView_Caption}}"
    SizeToContent="WidthAndHeight" 
    WindowStartupLocation="CenterScreen" 
    WindowStyle="SingleBorderWindow" 
    MinHeight="100" 
    MinWidth="250">
<StackPanel Name="AllItems" Orientation="Horizontal">
    <StackPanel Width="450" Margin="5">
        <StackPanel Margin="5,0,5,0" VerticalAlignment="Center">
            <DockPanel Margin="5" >
                <Label Content="Prompt"/>
                <TextBox MaxLines="3"
                     MinLines="3" 
                     VerticalScrollBarVisibility="Auto"
                     TextWrapping="Wrap" />
            </DockPanel>
        </StackPanel>
    </StackPanel>
</StackPanel>
...
</Window>

【问题讨论】:

  • 当我将代码粘贴到 XamlPadX 中时,TextBox 显示为 3 行
  • 对我也有用,你的问题在别处。发布更多包含 xaml 的内容?
  • 我遇到了同样的问题(不工作)
  • 显然这是 Windows 8/10 运行时中的一个错误,因为在 Windows 7/XP 中它没有这种行为。顺便说一句,它在 .NET 4.6.1 中仍未修复。

标签: wpf xaml textbox


【解决方案1】:

是的,我也遇到过这个问题。 TextBox 最初不会在启动时正确调整大小,您可以通过将 Text 属性与启动文本绑定来解决此问题(例如空格值“”)。

XAML:

<StackPanel Margin="5,0,5,0" VerticalAlignment="Center">
 <DockPanel Margin="5" >
 <Label Content="Prompt"/>
 <TextBox MaxLines="3"
         MinLines="3" x:Name="text"
         VerticalScrollBarVisibility="Auto"
         Text="{Binding StartUpText}"
         AcceptsReturn="True"
         TextWrapping="Wrap" TextChanged="text_TextChanged" Loaded="text_Loaded"  />
 </DockPanel>
</StackPanel>

C#:

public MainWindow()
    {
        InitializeComponent();
        this.DataContext=this;
         StartUpText = " ";
    }

private string startUpText;
public string StartUpText
{
  get { return startUpText; }
  set
  {
    if (value != startUpText)
    {
        startUpText = value;
    }
  }
}

【讨论】:

  • 你明白为什么会这样吗?我们不需要做这个变通方法。我真的不想在里面加上空格并把它们删掉。
  • 我不确定原因,我猜它是 TextBox Maxline 属性的错误
【解决方案2】:

您也可以在 Text 上使用 FallbackValue:

<StackPanel Margin="5,0,5,0" VerticalAlignment="Center">
     <DockPanel Margin="5" >
          <Label Content="Prompt"/>
          <TextBox MaxLines="3"
              MinLines="3" x:Name="text"
              VerticalScrollBarVisibility="Auto"
              Text="{Binding StartUpText, FallbackValue=whatyouwant}"
              AcceptsReturn="True"
              TextWrapping="Wrap" TextChanged="text_TextChanged" Loaded="text_Loaded"  />
     </DockPanel>
</StackPanel>

【讨论】:

  • 设置后备值也并不总是有效。例如,长度为零的字符串不会触发所需的布局,并且使用其他任何内容意味着该值将在绑定针对数据上下文初始化之前传播到 UI。查看我刚刚发布的解决这些问题的答案。
【解决方案3】:

结合使用 Height 属性和 MaxLines 时,我遇到了同样的问题。

"如果在 TextBox 上显式设置了 Height 属性,则 MaxLines 和 MinLines 属性值将被忽略。" - https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.textbox.maxlines?view=netframework-4.8

通过使用高度解决了这个问题,因此在给定的高度只能输入 5 行

【讨论】:

  • 你不应该使用任何Height 变体,因为它们不考虑字体大小等。你真的应该让控件处理大小,因为它会考虑字体.看看我刚刚发布的答案正是这样做的。设置需要做一些事情,但每个代码库只需执行一次。
猜你喜欢
  • 2016-05-13
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 1970-01-01
  • 2021-08-04
  • 2019-06-29
相关资源
最近更新 更多