2010-09-09 21 views
26

En una ventana que tengo hay una lista de DockPanel s para especificar un par de archivos. Cada DockPanel tiene un TextBox (para la ruta) y un botón (para buscar un archivo).WPF Dockpanel primer hijo utiliza el espacio restante

He recreado una simple página de WPF a demostrate el problema aquí:

<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> 

El problema es que quiero el botón a la derecha de la caja de texto, sino que hace que el cuadro de texto a ser muy pequeño, ya LastChild of DockPanel es el botón que usa en el espacio restante. He intentado cambiar esto al mezclarlos y configurar LastChildFill="False", pero eso solo hace que el botón vuelva a ser pequeño, sin hacer que el TextBox sea ancho (incluso con HorizontalAlignment="Stretch").

La razón por la que deseo que los controles estén en ese orden es que quiero que el usuario llegue al cuadro de texto antes del botón cuando usa tab para navegar por la ventana. Analicé el ajuste TabIndex, pero las características favoritas de WPF son que los tabindex están en el orden en que se definen las conexiones en el XAML. Sin mencionar que probablemente tendría que configurar manualmente TabIndex en todo en la ventana.

Para mí, parece que la configuración de TextBox.HorizontalAlignment no se respeta. ¿Cómo puedo hacer que el primer control use tanto espacio como pueda pero aún así conservar el orden de las pestañas?

Respuesta

23

Si no desea el comportamiento de DockPanel, no use un DockPanel.

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

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

+1, ya que no tiene problema TabOrder. Si alguien quiere evitar escribir ColumnDefinitions en escenarios tan simples, eche un vistazo a esta solución: http://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/ – surfen

34

Que sea así:

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

Brilliant! Completamente intuitivo y detestable, pero funcionaba como un amuleto y tiene un extraño sentido dado el diseño de DockPanel. Buena llamada. – TonganJedi

+8

Lo he visto en varias ocasiones. Mi principal preocupación es que el orden de los elementos en el XAML ya no coincida con el diseño visual de la ventana. Y arruina el orden de las pestañas. –

+0

Estoy de acuerdo con @ChristofferLette +1, pero por si acaso alguien lo necesitara, aquí está la solución para el problema de Taborder. Puede ser bastante trabajo manual y no siempre funciona bien (por ejemplo, con DataGrid): http://stackoverflow.com/a/4808810/724944 – surfen

Cuestiones relacionadas