.net - form - Cómo hacer que DockPanel llene el espacio disponible
wpf split panel (3)
Estoy probando el contenido de un carrito de compras en un ItemsControl(ListBox)
. Para hacerlo, he creado la siguiente DataTemplate
:
<DataTemplate x:Key="Templates.ShoppingCartProduct"
DataType="{x:Type viewModel:ProductViewModel}">
<DockPanel HorizontalAlignment="Stretch">
<TextBlock DockPanel.Dock="Left"
Text="{Binding Path=Name}"
FontSize="10"
Foreground="Black" />
<TextBlock DockPanel.Dock="Right"
Text="{Binding Path=Price, StringFormat=/{0:C/}}"
FontSize="10"
Foreground="Black" />
</DockPanel>
</DataTemplate>
Sin embargo, cuando los artículos se muestran en mi carrito de compras, los TextBlocks
Nombre y Precio se encuentran uno al lado del otro, y hay una gran cantidad de espacios en blanco en el lado derecho.
¿Se preguntaba cuál era el mejor método para obligar a DockPanel
a estirarse para llenar todo el espacio disponible por ListItem
?
Enlace el Width
del DockPanel
al ActualWidth
del ListBoxItem
:
<DockPanel Width="{Binding ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">
...
Otra opción: simplemente podría redefinir el ItemContainerStyle
para que el ListBoxItem
se estire horizontalmente:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
Lo bueno de los paneles de base es que ya llenan todo el espacio disponible. LastChildFill es verdadero por defecto (pero lo establezco a continuación), así que simplemente no establezca el atributo DockPanel en el último elemento secundario, y llenará el espacio disponible.
<DockPanel HorizontalAlignment="Stretch" LastChildFill="true">
<TextBlock DockPanel.Dock="Left"
Text="{Binding Path=Name}"
FontSize="10"
Foreground="Black" />
<TextBlock
Text="{Binding Path=Price, StringFormat=/{0:C/}}"
FontSize="10"
Foreground="Black" />
</DockPanel>
DockPanel
s son malvados. La tentación de usar la combinación StackPanel/DockPanel
para diseños complejos conduce a "callejones sin salida". Utilice una cuadrícula:
<Grid>
<TextBlock HorizontalAlignment="Left"
...
<TextBlock HorizontalAlignment="Right"
...
/Grid>
Yo uso Grid
s casi exclusivamente, usando una grilla separada para cada bloque de elementos que "pertenecen juntos"