wpf xaml binding silverlight-4.0 width

wpf - cómo vincular el ancho del elemento hijo al ancho del elemento principal en Silverlight



xaml binding (7)

Tengo una cuadrícula cuyo ancho es "1 *". Entonces creo que el ancho real decidido en tiempo de ejecución. Dentro de esa grilla tengo otra grilla cuyo ancho quiero establecer en el ancho de tiempo de ejecución de la grilla padre. ¿Cómo puedo hacer eso en xaml a través de enlace?


¿Esta solución debería funcionar también con WPF? Lo probé y descubrí que estaba bien para escalar. Cuando intenté escalar la ventana hacia abajo, mi cuadrícula contenida con una pila parecía mantener su tamaño máximo.

<StackPanel Name="stackPanelClassifiers" Orientation="Horizontal" Background="cyan" Height="200" HorizontalAlignment="Stretch" VerticalAlignment="Top" Opacity=".8"> <Grid Name="gridClassifierDisplay" VerticalAlignment="Stretch" Background="LightGoldenrodYellow" Width="{Binding ActualWidth, ElementName=stackPanelClassifiers}">


Creo que la forma más fácil de hacer lo mismo es:

HorizontalAlignment="Stretch"

Eso no es vinculante como se te ha pedido, pero es más fácil.


Esta es una solución genérica que puede funcionar en todas partes. No necesitarías escribir el nombre del elemento principal. Esto identificará su padre y tomará el ancho de los padres.

Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualWidth}"


Esto realmente te ayudará, supongo

Width="{Binding ActualWidth, ElementName=parentElementName}"

Esto vincula el ancho del elemento principal o el nombre del elemento provisto


Si está dentro de una Plantilla, usa esto:

<ListBox> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical"> <Image Width="{TemplateBinding Width}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Source="TestImage.png"/> <TextBlock HorizontalAlignment="Center" Text="Test Text"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>


Si lo haces en CodeBehind, esto funciona para mí. Tiene la ventaja adicional de que bindMe no tiene que ser un hijo de toMe:

public static void BindWidth(this FrameworkElement bindMe, FrameworkElement toMe) { Binding b = new Binding(); b.Mode = BindingMode.OneWay; b.Source = toMe.ActualWidth; bindMe.SetBinding(FrameworkElement.WidthProperty, b); }

uso:

child.BindWidth(parent);


Width = "{Binding Width, RelativeSource = {RelativeSource AncestorType = {x: Type Parent}, Mode = FindAncestor}}"

si ambos controles DataContext son diferentes.