Подтвердить что ты не робот

Первый ребенок WPF Dockpanel использует оставшееся пространство

В окне у меня есть список DockPanel, чтобы указать пару файлов. Каждый DockPanel имеет TextBox (для пути) и кнопку (для поиска файла).

Я воссоздал простую страницу WPF, чтобы продемонстрировать проблему здесь:

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="150"
    Height="22">
    <DockPanel>
        <TextBox HorizontalAlignment="Stretch"/> <!-- path to file -->
        <Button Content="..." DockPanel.Dock="Right"/> <!-- button to browse for file -->
    </DockPanel>
</Page>

Проблема в том, что я хочу, чтобы кнопка справа от текстового поля, но это делает текстовое поле действительно маленьким, поскольку LastChild DockPanel - это кнопка, в которой используется оставшееся пространство. Ive попытался изменить это, перетасовывая их и устанавливая LastChildFill="False", но это только заставляет кнопку быть маленькой снова, не делая TextBox широким (даже с HorizontalAlignment="Stretch").

Причина, по которой я хочу, чтобы элементы управления в этом порядке, я хочу, чтобы пользователь дошел до TextBox до кнопки при использовании tab для навигации по окну. Я посмотрел на настройку TabIndex, но он чувствует себя взломанным, любимые функции WPF в том, что tabindex находится в том порядке, в котором конроллы определены в XAML. Не говоря уже о том, что мне, вероятно, придется вручную установить TabIndex на все в окне.

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

4b9b3361

Ответ 1

Если вы не хотите поведения DockPanel, не используйте DockPanel.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>

    <TextBox />
    <Button Content="..." Grid.Column="1"/>
</Grid>

Ответ 2

Сделайте это так:

<DockPanel LastChildFill="True">
    <Button Content="..." DockPanel.Dock="Right"/> <!-- button to browse for file -->
    <TextBox DockPanel.Dock="Left" HorizontalAlignment="Stretch"/> <!-- path to file -->
</DockPanel>