top form example control .net wpf autosize dockpanel

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