WPF Dockpanel первый ребенок использует оставшееся место - PullRequest
30 голосов
/ 09 сентября 2010

В моем окне есть список 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 - это кнопка, занимающая оставшееся пространство.Я пытался изменить это, перетасовывая их и устанавливая LastChildFill="False", но это только приводит к тому, что кнопка снова становится маленькой, не делая TextBox широким (даже с HorizontalAlignment="Stretch").

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

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

Ответы [ 2 ]

39 голосов
/ 05 ноября 2010

Сделай так:

<DockPanel LastChildFill="True">
    <Button Content="..." DockPanel.Dock="Right"/> <!-- button to browse for file -->
    <TextBox DockPanel.Dock="Left" HorizontalAlignment="Stretch"/> <!-- path to file -->
</DockPanel>
27 голосов
/ 09 сентября 2010

Если вам не нужно поведение DockPanel, не используйте DockPanel.

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

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