Как не дать дочерним элементам панели превышать границы, если для нее установлена ​​максимальная ширина? - PullRequest
4 голосов
/ 16 января 2011

Я наблюдал эту проблему в Grids и StackPanels, она может относиться и к другим панелям, рассмотрим следующие Xamls:

<Grid MaxWidth="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Label>Title:</Label>
    <TextBox Grid.Column="1" Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

и

<StackPanel MaxWidth="200">
    <Label>Title:</Label>
    <TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>

(Редактировать: у меня есть несколько таких переменных блоков, поэтому я не устанавливаю MaxWidth самого TextBox)

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

Если второй столбец сетки имеетширина не определена (по умолчанию одна звезда), TextBox не будет расти, поскольку он просто занимает все доступное пространство, поэтому текст прокручивается так, как я хочу, но эта панель является элементом в ToolBar, а если ToolBarв горизонтальном ToolBarTray этот параметр вызывает мгновенное переполнение.

Любые идеи о том, как заставить TextBox не выходить за пределы?

Редактировать: Theответы (вероятно) работают в нормальных сценариях, но панель инструментов как-то scrТеперь мой макет закончен, во-первых, мои элементы управления всегда выталкиваются в область переполнения панели инструментов по любой причине и содержимому, которые до растяжения внутри Grid-ячейки больше не делают этого.Поскольку мой первоначальный вопрос был о том, как предотвратить это внутреннее переполнение (а не о том, как справиться с особенностями панели инструментов), я просто оставлю это на этом.

Ответы [ 3 ]

1 голос
/ 16 января 2011

Измените вторую ширину ColumnDefinition на *, установите для текстового поля HorizontalAlignment растяжение, а для TextWrapping - Обтекание, чтобы получить желаемый эффект (см. XAML ниже)

<Grid x:Name="myGrid" MinWidth="200" MaxWidth="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Label>Title:</Label>
    <TextBox Margin="5" TextWrapping="Wrap" Grid.Column="1" Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}"
             HorizontalAlignment="Stretch"/>
</Grid>

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

1 голос
/ 16 января 2011

Другая возможность:

    <DockPanel MaxWidth="200">
        <Label DockPanel.Dock="Left" VerticalAlignment="Center">Title:</Label>
        <TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" 
                 TextWrapping="Wrap" VerticalAlignment="Center"/>
    </DockPanel>
0 голосов
/ 16 января 2011

Я не уверен, если это не противоречит требованиям вашего приложения, но вы пытались установить MaxLength TextBox?

...