2010-09-09 13 views
26

Dans une fenêtre, il y a une liste de DockPanel s pour spécifier quelques fichiers. Chaque DockPanel a un TextBox (pour le chemin) et un bouton (pour rechercher un fichier).WPF Dockpanel le premier enfant utilise l'espace restant

J'ai recréé une simple page WPF à demostrate le problème ici:

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

Le problème est que je veux que le bouton à droite de la zone de texte, mais qui provoque la zone de texte pour être vraiment petit depuis le LastChild du DockPanel est le bouton qu'il utilise jusqu'à l'espace restant. Ive a essayé de changer cela en les mélangeant et en réglant LastChildFill="False" mais cela ne fait que redonner une petite taille au bouton, ne rendant pas le TextBox large (même avec HorizontalAlignment="Stretch").

La raison pour laquelle je veux les contrôles dans cet ordre est que je veux que l'utilisateur atteigne le TextBox avant le bouton lors de l'utilisation tab pour naviguer dans la fenêtre. J'ai regardé dans le réglage TabIndex mais il semble hacky, les fonctionnalités préférées de WPF est que tabindex sont dans l'ordre dans lequel les contrôles sont définis dans le XAML. Sans oublier que je devrais probablement mettre manuellement TabIndex sur tout dans la fenêtre.

Pour moi, il semble que le réglage de TextBox.HorizontalAlignment n'est pas respecté. Comment puis-je faire en sorte que le premier contrôle utilise autant d'espace que possible tout en conservant l'ordre des onglets?

Répondre

23

Si vous ne voulez pas le comportement de DockPanel, n'utilisez pas un DockPanel.

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

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

+1 parce qu'il n'a pas question TabOrder. Si quelqu'un veut éviter de taper ColumnDefinitions dans de tels scénarios simples, jetez un oeil à cette solution: http://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/ – surfen

34

Faire comme ceci:

<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! Complètement non intuitif et désagréable, mais a fonctionné comme un charme et fait un genre bizarre de sens étant donné comment DockPanel est conçu. Bon appel. – TonganJedi

+8

J'ai déjà vu ça à plusieurs reprises. Ma principale préoccupation est que l'ordre des éléments dans le XAML ne correspond plus à la disposition visuelle de la fenêtre. Et ça chamboule l'ordre des onglets. –

+0

Je suis d'accord avec @ChristofferLette +1, mais juste au cas où quelqu'un en aurait besoin, voici la solution de contournement pour le problème taborder. Cela peut être assez fastidieux et ne fonctionne pas toujours bien (par exemple avec DataGrid): http://stackoverflow.com/a/4808810/724944 – surfen