WPF多行TextBox不呈现为多行

时间:2015-11-29 16:17:54

标签: c# wpf

在窗口中使用以下XAML和Grid(它可能是Window中唯一的元素):

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" SpellCheck.IsEnabled="True" TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="True" MinLines="5" MaxLines="5">
        Any text
    </TextBox>
</Grid>

当我运行应用程序时,TextBox不是多行的: TextBox with no multiline

然而,当我在TextBox中进行任何编辑时,它会立即正确地重新呈现: TextBox after editting

是什么导致了这个问题以及如何解决它(如果可能的话,我宁愿不破解任何东西)?

1 个答案:

答案 0 :(得分:1)

所以在玩了一段时间之后我通过将文本绑定到ViewModel中的属性来实现它

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" 
             SpellCheck.IsEnabled="True" 
             TextWrapping="Wrap"
             AcceptsTab="True" 
             MinLines="5"
             MaxLines="5"
             Text="{Binding Text}">
    </TextBox>
</Grid>

public class MainWindowViewModel : INotifyPropertyChanged
{
    public MainWindowViewModel()
    {
        Text = "My Text";
    }

    public string Text { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

这让我觉得这个问题与WPF将控件呈现给屏幕的顺序有关,但不确定究竟是什么。这并没有回答你为什么会发生这种情况的问题,但是由于MVVM WPF应用程序中文本框的常见用法是通过绑定而不是硬编码文本来完成的,因此这应该足以作为解决方案。