2010-09-09 4 views
26

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

Я воссоздан простая страница WPF для demostrate проблемы здесь:

<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").

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

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

ответ

23

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

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

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

+1, потому что он не имеет TabOrder вопрос. Если кто-то хочет избежать ввода ColumnDefinitions в таких простых сценариях, посмотрите на это решение: http://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/ – surfen

34

Сделать это следующим образом:

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

Блестящий! Полностью неинтуитивный и неприятный, но работал как шарм и создает странный смысл, учитывая, как DockPanel разработан. Хороший звонок. – TonganJedi

+8

Я видел это несколько раз. Моя главная проблема заключается в том, что порядок элементов в XAML больше не соответствует визуальному расположению окна. И это испортит порядок вкладок. –

+0

Я согласен с @ChristofferLette +1, но на всякий случай кому-то это нужно, вот обходной путь для проблемы с табордингом. Это может быть довольно много ручной работы и не всегда хорошо работает (например, с DataGrid): http://stackoverflow.com/a/4808810/724944 – surfen

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