TextBox с динамическим размером, который не расширяется при вводе?

У меня возникла проблема, когда я хочу, чтобы текстовые поля в моем приложении динамически изменяли размер окна, но не расширялись, когда пользователь вводит текст.

Однако после поиска не оказалось, что существует универсальное решение для исправления всех текстовых полей в приложении, за исключением добавления привязок XAML для свойств MaxWidth и MaxHeight текстового поля.

Поэтому я создал следующий элемент управления для автоматической блокировки размеров текстовых полей после вызова Measure():

<TextBox x:Class="GUI.Views.Controls.FixedTextBox"
             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">
</TextBox>

public partial class FixedTextBox : TextBox
    {
        public FixedTextBox()
        {
            InitializeComponent();
        }

        protected override Size MeasureOverride(Size constraint)
        {
            UnboundDimensions();
            var measured = base.MeasureOverride(constraint);
            BoundDimensions();
            return measured;
        }

        private void UnboundDimensions()
        {
            MaxWidth = Double.PositiveInfinity;
            MaxHeight = Double.PositiveInfinity;
        }

        private void BoundDimensions()
        {
            MaxWidth = ActualWidth > 0 ? ActualWidth : Double.PositiveInfinity;
            MaxHeight = ActualHeight > 0 ? ActualHeight : Double.PositiveInfinity;
        }
    }

Это решение отлично работает, но мне было интересно, есть ли лучший способ, прежде чем я просмотрю свой код XAML и изменю текстовые поля на свой пользовательский элемент управления....?

Изменить (пример проблемы): https://dl.dropboxusercontent.com/u/28956841/TextBoxTrouble.zip

<Window x:Class="TextBoxTrouble.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="150" Width="500">

    <ScrollViewer HorizontalScrollBarVisibility="Auto"
                  VerticalScrollBarVisibility="Auto">
        <Grid Grid.IsSharedSizeScope="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition SharedSizeGroup="Labels"></ColumnDefinition>
                <ColumnDefinition></ColumnDefinition>
                <ColumnDefinition Width="5"></ColumnDefinition>
                <ColumnDefinition SharedSizeGroup="Labels"></ColumnDefinition>
                <ColumnDefinition Width="2*"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="40"></RowDefinition>
                <RowDefinition></RowDefinition>
            </Grid.RowDefinitions>

            <Label Grid.Column="0"
                   Grid.Row="0"
                   VerticalContentAlignment="Center">Label 1</Label>
            <TextBox Grid.Column="1"
                     Grid.Row="0"
                     Margin="10">Some text</TextBox>

            <Label Grid.Column="3"
                   Grid.Row="0"
                   VerticalContentAlignment="Center">Label 2</Label>
            <TextBox Grid.Column="4" 
                     Grid.Row="0"
                     Grid.RowSpan="2"
                     Margin="10"
                     VerticalScrollBarVisibility="Auto"
                     HorizontalScrollBarVisibility="Disabled"
                     AcceptsReturn="True"
                     TextWrapping="Wrap">Some multiline text</TextBox>
        </Grid>
    </ScrollViewer>
</Window>

person Alex Hope O'Connor    schedule 09.01.2014    source источник
comment
Я не думаю, что у меня когда-либо была проблема, которую вы описываете. Можете ли вы опубликовать небольшую полную программу, демонстрирующую описанное вами поведение? MainWindow.xaml и .cs было бы хорошо. Я подозреваю, что проблема может быть в родительском файле TextBox.   -  person Steve    schedule 09.01.2014
comment
Согласен @Стив. У меня никогда не было автоматического расширения текстового поля для заполнения содержимого. Происходит что-то еще. Покажите нам свой файл xaml, как просили.   -  person Thraka    schedule 09.01.2014
comment
Вот пример проблемы: dl.dropboxusercontent.com/u/28956841/TextBoxTrouble. заархивировать   -  person Alex Hope O'Connor    schedule 09.01.2014
comment
Пожалуйста, отправьте код здесь, в вашем вопросе.   -  person Steve    schedule 09.01.2014


Ответы (1)


Проблема в коде, который вы разместили (все, что мне нужно было опубликовать, чтобы найти вашу проблему, - это содержимое MainWindow.xaml) заключается в том, что вам нужно установить HorizontalScrollBarVisibility="Disabled" для вашего внешнего ScrollViewer.

<Window x:Class="TextBoxTrouble.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="150" Width="500">

    <ScrollViewer HorizontalScrollBarVisibility="Auto" <!-- THIS LINE -->
                  VerticalScrollBarVisibility="Auto">
person Steve    schedule 09.01.2014
comment
Взгляните на пример, вам, вероятно, придется его запустить, потому что поведение не такое, как я ожидал от XAML. Я думаю, что это как-то связано с использованием Grid.IsSharedSizeScope.... - person Alex Hope O'Connor; 09.01.2014
comment
К сожалению, мне нужны полосы прокрутки в обоих направлениях, иначе это было бы так просто, но проблема также в вертикальном направлении, представление, частью которого является это, является своего рода контейнером для размещения других представлений, некоторые из которых довольно большие. - person Alex Hope O'Connor; 09.01.2014
comment
Мне кажется, я не совсем понимаю, что вы ищете. Вы не хотите, чтобы текстовые поля изменяли размер при вводе текста, поэтому вам нужен самый внешний ScrollViewer в случае, если размер окна изменяется меньше, чем его первоначальный размер? Если да, то почему бы просто не установить высоту/ширину элементов управления и все? - person Steve; 09.01.2014
comment
Это странное поведение. Хотя у меня нет ответа, у меня есть подозрение, что это связано с вашими TextBoxes, которые не имеют фиксированного размера, а также имеют ScrollContentPresenters внутри себя. Затем они помещаются в другой ScrollViewer, в котором есть еще один ScrollContentPresenter. Теперь у нас есть контейнер (внешний ScrollViewer) без фиксированного размера и некоторые другие элементы управления без фиксированного размера. Как менеджер компоновки узнает, что и когда нужно изменить? Я уже видел странное поведение, когда один ScrollViewer вставлялся в другой. - person Steve; 09.01.2014
comment
Ознакомьтесь с этим вопросом/ответом: stackoverflow.com/questions/ 7584067/ - person Steve; 09.01.2014
comment
Я в основном надеялся, что есть простое свойство или что-то, что я мог бы установить, чтобы остановить изменение размера элемента управления в зависимости от его содержимого, потому что это конкретное поведение, которое я хочу остановить. Но три решения, похоже, представляют собой настраиваемый код меры, привязку максимальных размеров и изменение структуры макета вместе. - person Alex Hope O'Connor; 09.01.2014