2010-08-23 18 views
13

Tengo una DockPanel estableció en el DataTemplate de ItemsControl de la siguiente manera:DockPanel orden de tabulación

<ItemsControl HorizontalContentAlignment="Stretch"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <DockPanel> 
     <ComboBox DockPanel.Dock="Left"/> 
     <ComboBox DockPanel.Dock="Left"/> 
     <Button DockPanel.Dock="Right">Button</Button> 
     <!-- This will appear before the button...it has to go after it in the XAML so it will fill properly in the DockPanel --> 
     <TextBox DockPanel.Dock="Left" MinWidth="100" HorizontalAlignment="Stretch"/> 
     </DockPanel> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

quiero que el cuadro de texto para llenar todo el espacio que queda entre los cuadros combinados y el botón. Tuve que poner el cuadro de texto al final en XAML porque DockPanel solo ocupará el último hijo. Se ve genial; sin embargo, el orden de las pestañas ahora está arruinado. Ahora pestañas combobox-combobox-button-textbox en lugar de combobox-combobox-textbox-button.

He intentado usar KeyboardNavigation.TabIndex propiedades en cada elemento, pero dado que esto es un DataTemplate para un ItemsControl (cada uno de estos dockpanels será para un elemento separado), el orden de tabulación salta verticalmente hacia abajo en cada cuadro combinado de los elementos. luego verticalmente hacia abajo cada cuadro de texto, luego hacia abajo verticalmente cada botón, en lugar del comportamiento deseado de ir a través de cada fila, luego hacia abajo.

Ejemplo UI:

[Combo11] [Combo12] [Text1] [Button1] 
[Combo21] [Combo22] [Text2] [Button2] 

En el estado actual de las cosas, va Combo11,Combo12,Button1,Text1,Combo21,Combo22,Button2,Text2. Si agrego las propiedades de TabOrder, va al Combo11,Combo21,Combo12,Combo22,Text1,Text2,Button1,Button2.

me gustaría que vaya Combo11,Combo12,Text1,Button1,Combo21,Combo22,Text2,Button2.

¿Alguien tiene alguna idea sobre cómo resolver este problema de interfaz de usuario?

Respuesta

6

se puede utilizar una cuadrícula en lugar de la DockPanel, así:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <ComboBox /> 
    <ComboBox Grid.Column="1"/> 
    <TextBox Grid.Column="2" MinWidth="100" /> 
    <Button Grid.Column="3">Button</Button> 
</Grid> 

Y si usted quiere que se alinean perfectamente en las diferentes columnas - se puede utilizar SharedSizeGroup.

+0

Eso funcionó muy bien ... y tengo que preguntar, ¿por qué el primer cuadro combinado no tiene un número de columna? ¿Significa eso que se asigna automáticamente a la columna # 0? Y muchas gracias por la sugerencia de SharedSizeGroup: ¡no tenía ni idea de qué buscar! (p.s. has olvidado/en) – NickAldwin

+0

Podría tener un Grid.Column = "0" - pero 0 es el valor predeterminado - y soy perezoso :-). Sí, SharedSizeGroup es una especie de joya escondida. Actualicé mi ejemplo para otros. – Goblin

+0

Bah, no se pudo conseguir que SharedSizeGroup funcione correctamente, probablemente debido al tamaño en estrella de la tercera columna. :( – NickAldwin

-5

Ha intentado establecer el orden de tabulación de forma explícita?

<Control KeyboardNavigation.TabIndex="0" /> 
+0

"Intenté usar las propiedades KeyboardNavigation.TabIndex en cada elemento, pero dado que esto es un DataTemplate para ItemsControl (cada uno de estos dockpanels será para un elemento separado), eso hizo que el orden de tabulación saltara verticalmente hacia abajo cada uno de los elementos ' cuadros combinados, luego verticalmente hacia abajo cada cuadro de texto, luego verticalmente hacia abajo cada botón, en lugar del comportamiento deseado de ir a través de cada fila, luego hacia abajo ". – NickAldwin

+0

Wow, ¿seriamente un voto negativo para esto? – Robaticus

+4

No hay daño significaba, pero tienden a downvote respuestas que en realidad no ayudan a explicar nada ... en este ejemplo, que ya había mencionado tratar el orden de tabulación en mi pregunta. Una vez más, sé ya que no puede oírme hablar, se podría malinterpretar esto como un comentario sarcástico, pero estoy realmente tratando de mantener Stackoverflow un lugar útil y ordenado. – NickAldwin

24

Si desea conservar el DockPanel, puede usar KeyboardNavigation.TabNavigation = "Local" en el panel del dock padre, y luego PUEDE establecer los valores del índice de tabulación en los controles dentro de él.

como no -

<ItemsControl HorizontalContentAlignment="Stretch"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <DockPanel KeyboardNavigation.TabNavigation="Local"> 
        <ComboBox DockPanel.Dock="Left" TabIndex="1"/> 
        <ComboBox DockPanel.Dock="Left" TabIndex="2"/> 
        <Button DockPanel.Dock="Right" TabIndex="4">Button</Button> 
        <!-- This will appear before the button...it has to go after it in the XAML so it will fill properly in the DockPanel --> 
        <TextBox DockPanel.Dock="Left" MinWidth="100" HorizontalAlignment="Stretch" TabIndex="3"/> 
       </DockPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

como lo encontró, si usted acaba de establecer los valores de índice de tabulación de los controles, éstos son globales a la forma, así que todo el ÍndiceDeTabulación = "0" en forma de fichas en primer lugar, a continuación, todos los TabIndex = "1", y así sucesivamente. Establecer KeyboardNavigation.TabNavigation = "Local" en el contenedor primario lo corrige.

+3

Me gusta esta opción, ya que en algunos casos me siento muy convencido sobre el diseño DockPanel y me esforcé por evitar el uso de grillas en todas partes, a menos que tuvieran sentido por algún otro motivo. – TheZenker

Cuestiones relacionadas