2015-11-09 3 views
0

Недавно я испытал странное поведение текстовых полей.ExtentWidth TextBox не установлен правильно

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="200"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <Label Content="Test"/> 
    <TextBox Grid.Column="1" TextWrapping="Wrap" Text="testtesttesttesttesttesttesttesttesttesttest"/> 
    <Control Grid.Row="1" Grid.ColumnSpan="2" Width="280"/> 
</Grid> 

В этом примере кода У меня есть Grid с 2 строк и столбцов 2. Второй столбец установлен на фиксированной шириной. Номер TextBox имеет TextWrapping установлен на Wrap.

Во втором ряду у меня есть Control с фиксированной шириной, которая выше, чем Grid. Это увеличивает ActualWidth второй колонны от 200 до 250.

Фактическая ширина TextBox также увеличивается, чтобы соответствовать новой ширине столбца.

Когда я теперь добавляю длинную строку в текстовое поле, текст не использует всю ширину TextBox, а вместо этого обматывает путь до начала и оставляет около 40 пикселей в конце TextBox пустым.

Я выяснил, что у TextBox есть только ExtentWidth. Это свойство отвечает за упаковку. В моем примере значения ExtentWidth составляют около 180, что составляет 200 от ширины столбца сетки минус поля и прокладки.

Что можно сделать, чтобы зафиксировать упаковку в TextBox?

EDIT: Этот вопрос не является дубликатом Looking for explanation for WPF Grid ColumnSpan behavior. Этот вопрос объясняет, что происходит с ширинами столбцов сетки. Но он не отвечает на вопрос об обертывании TextBox.

+0

Это поведение, по-видимому, не зависит от ширины «управления». Это вызывает «Grid.ColumnSpan =« 2 »». Я не знаю, это воля или нет ?! «Grid.ColumnSpan» также может быть ошибкой автокоррекции. – Jens

+0

Возможный дубликат [Ищет объяснения для поведения столбцов WPF Grid ColumnSpan] (http://stackoverflow.com/questions/5679081/looking-for-explanation-for-wpf-grid-columnspan-behavior) – Jens

+0

@Jens Horstmann: столбцы диапазон был установлен намеренно. И да, это часть проблемы. Что касается возможного дубликата, см. Мое редактирование. – raznagul

ответ

0

честно, я не понимаю «почему» часть, но пока кто-то не дает содержательное объяснение, вот некоторые обходные пути:

  • Установить явную ширину на TextBox
  • Установите MaxWidth на колонке вместо Width
  • Привяжите ширину TextBox к ширине другого элемента внутри того же столбца. например:

    <TextBox Grid.Column="1" Width="{Binding ActualWidth, ElementName=rect}" ... /> <Rectangle Grid.Column="1" x:Name="rect"/>

Обратите внимание, что последний является единственным использовать обходной путь, если вам нужно, чтобы иметь возможность изменять ширину столбцов во время выполнения и хотите TextBox (и обертывание), чтобы изменить с ним ,

+0

Я знаю этот хак и нахожу его уродливым. Я устанавливаю ширину столбца сетки данных, поэтому мне это не понадобится. – raznagul

+0

да, я старался выбрать слово «взломать».Если вы не хотите указать явную ширину в текстовое поле или явный MaxWidth для столбца, это единственный способ, который я могу найти. Если кто-то даст лучший ответ (я уверен, что они будут), я удалю этот ответ. Текстовое окно, похоже, пропускает какое-то уведомление. Если вы поместите сетку gridsplitter рядом с ней, проблема с упаковкой все еще существует в начале, но как только вы перемещаете сплиттер, проблема исчезает. Я попытался сделать InvalidateArrange и InvalidateMeasure при изменении размера, но это тоже не сработало. –

+0

Использование MaxWidth вместо Width устраняет проблему для меня. Если добавить это к ответу, я соглашусь с ним. – raznagul

Смежные вопросы