2010-09-09 17 views
26

W oknie, które mam, znajduje się lista DockPanel s, aby określić kilka plików. Każdy DockPanel ma TextBox (dla ścieżki) i przycisk (aby wyszukać plik).Pierwsze dziecko z Dockpanela używa pozostałej przestrzeni.

Mam odtworzone prostą stronę WPF do demostrate tu problem:

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

Problem polega na tym, że chcę przycisk po prawej stronie pola tekstowego, ale to powoduje, że pole tekstowe, aby być naprawdę małe, ponieważ LastChild of DockPanel to przycisk, który zużywa pozostałą przestrzeń. Ive starał się to zmienić, przesuwając je wokół i ustawiając LastChildFill="False", ale to tylko powoduje, że przycisk jest ponownie mały, nie czyniąc TextBox szeroki (nawet z HorizontalAlignment="Stretch").

Powód, dla którego chcę, aby kontrolki w tej kolejności były, chcę, aby użytkownik dotarł do TextBox przed przyciskiem, gdy używasz tab do nawigacji w oknie. Spojrzałem na ustawienie TabIndex, ale czuję się hacky, ulubionymi cechami WPF jest to, że tabindex są w kolejności, w której konflikty są zdefiniowane w XAML. Nie wspominając, że prawdopodobnie musiałbym ręcznie ustawić TabIndex na wszystko w oknie.

Wydaje mi się, że ustawienie TextBox.HorizontalAlignment nie jest przestrzegane. W jaki sposób mogę sprawić, by pierwsza kontrola używała tyle miejsca, ile jest w stanie, ale zachowała kolejność kart?

Odpowiedz

23

Jeśli nie chcesz zachować DockPanel, nie używaj DockPanel.

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

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

+1, ponieważ nie mają TabOrder problem. Jeśli ktoś chce uniknąć wpisywania ColumnDefinitions w takich prostych scenariuszach, spójrz na to rozwiązanie: http://rachel53461.wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/ – surfen

34

Zrób to tak:

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

Genialny! Całkowicie nieintuicyjny i nieprzyjemny, ale działał jak urok i wydaje dziwny sens, biorąc pod uwagę sposób zaprojektowania DockPanel. Dobra decyzja. – TonganJedi

+8

Widziałem to przy kilku okazjach. Moją główną obawą jest to, że kolejność elementów w XAML nie pasuje już do wizualnego układu okna. I przenosi kolejność kart. –

+0

Zgadzam się z @ChristofferLette +1, ale na wypadek, gdyby ktoś tego potrzebował, oto sposób obejścia problemu z taborem. Może to być dość dużo pracy ręcznej i nie zawsze działa dobrze (na przykład z DataGrid): http://stackoverflow.com/a/4808810/724944 – surfen

Powiązane problemy