2010-09-09 11 views
26

In einem Fenster habe ich eine Liste von DockPanel s, um ein paar Dateien anzugeben. Jedes DockPanel hat eine TextBox (für den Pfad) und eine Schaltfläche (um nach einer Datei zu suchen).WPF Dockpanel erstes Kind verwendet verbleibenden Platz

ich eine einfache WPF Seite neu erstellt habe, das Problem hier verdeutlichen soll:

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

Das Problem ist, dass ich auf die Schaltfläche rechts neben der Textbox will, aber das bewirkt, dass die Textbox wirklich klein sein, da Das LastChild des DockPanel ist die Schaltfläche, die den verbleibenden Speicherplatz belegt. Ich habe versucht, dies zu ändern, indem Sie sie mischen und LastChildFill="False" setzen, aber das bewirkt nur, dass die Schaltfläche wieder klein ist, die TextBox nicht breit (selbst mit HorizontalAlignment="Stretch").

Der Grund, warum ich die Steuerelemente in dieser Reihenfolge möchte, ist, dass ich möchte, dass der Benutzer die TextBox vor der Schaltfläche erreicht, wenn Sie tab verwenden, um im Fenster zu navigieren. Ich schaute in Einstellung TabIndex, aber es fühlt sich hacky, Lieblingsfeatures von WPF ist, dass Tabindex in der Reihenfolge sind, die die Conrols im XAML definiert sind. Ganz zu schweigen davon, dass ich wahrscheinlich TabIndex für alles im Fenster manuell setzen müsste.

Mir scheint, dass die Einstellung von TextBox.HorizontalAlignment nicht respektiert wird. Wie kann ich die erste Steuerung so viel Platz wie möglich verwenden, aber die Tab-Reihenfolge beibehalten?

Antwort

23

Wenn Sie das Verhalten von DockPanel nicht möchten, verwenden Sie kein DockPanel.

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

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

+1, weil es nicht TabOrder Problem hat. Wenn jemand vermeiden möchte, ColumnDefinitions in solchen einfachen Szenarien einzugeben, werfen Sie einen Blick auf diese Lösung: http://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/ – surfen

34

es wie folgt bilden:

<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! Völlig unintuitiv und anstößig, aber funktionierte wie ein Charme und macht einen seltsamen Sinn, wenn man bedenkt, wie DockPanel entworfen wurde. Guter Ruf. – TonganJedi

+8

Ich habe das bei mehreren Gelegenheiten gesehen. Mein Hauptanliegen ist, dass die Reihenfolge der Elemente im XAML nicht mehr dem visuellen Layout des Fensters entspricht. Und es vermasselt die Tab-Reihenfolge. –

+0

Ich stimme @ChristofferLette +1, aber nur für den Fall, dass jemand es benötigt, hier ist die Problemumgehung für Taborder-Problem. Es kann ziemlich viel manuelle Arbeit sein und funktioniert nicht immer gut (zum Beispiel mit DataGrid): http://stackoverflow.com/a/4808810/724944 – surfen