/ / Enlace de elementos WPF con elementos de UI generados dinámicamente - wpf, dynamic, binding, element

WPF Element Binding con elementos de interfaz de usuario generados dinámicamente - wpf, dynamic, binding, element

Tengo una página en la que tengo una grilla con 2columnas, una con 80 * de ancho y la otra con 20 *. Debajo de la cuadrícula hay un panel de pila en el que cargo elementos de IU (paneles de pila secundarios) en tiempo de ejecución.

Mi objetivo es unir los anchos de laPila de pilas para las columnas de la cuadrícula. Esto funciona perfectamente y los stackpenels cambian de tamaño si el contenido dinámico se simula para ser estático en la vista de diseño. Pero cuando se ejecuta la aplicación, los enlaces fallan y los anchos no están vinculados.

¿Hay alguna forma de actualizar los enlaces para que pueda notificar a los stackpels para consultar los anchos de la cuadrícula y configurar su tamaño?

Actualizado: Así es como se ve mi XAML:

<Page x:Class="WPFTestApp.Page1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Page1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<Grid x:Name="resizeGrid"
Grid.Column="0" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="leftColumn"
Width="80*" />
<ColumnDefinition x:Name="rightColumn"
Width="20*" />
</Grid.ColumnDefinitions>
</Grid>

<StackPanel x:Name="contentPanel"
Grid.Column="0" Grid.Row="0" >
<!-- Dynamic StackPanels are added here -->
</StackPanel>
</Grid>
</Page>

En mi código, creo elementos de StackPanel y los agrego a contentPanel diciendo: contentPanel.Children.Add (...);

Desafortunadamente, TENGO que usar StackPanels aquí. :-(

El marcado de un elemento StackPanel creado dinámicamente es el siguiente (tenga en cuenta que ya uso un enlace a la cuadrícula en XAML):

<StackPanel x:Name="element01"
Orientation="Horizontal"
Width="{Binding ElementName=resizeGrid, Path=ActualWidth}" >
<StackPanel x:Name="leftPanel"
Orientation="Vertical"
Width="{Binding ElementName=leftColumn, Path=ActualWidth}">
<!-- Content goes here -->
</StackPanel>
<StackPanel x:Name="rightPanel"
Orientation="Vertical"
Width="{Binding ElementName=rightColumn, Path=ActualWidth}">
<!-- Content goes here -->
</StackPanel>
</StackPanel>

El código XAML para mis elementos dinámicos de StackPanel se genera a través de una transformación XSLT

Tenga en cuenta el xmlns: x namespace dynamic StackPanel. Esto también tiene que hacerse porque se genera a través de XSLT

Respuestas

0 para la respuesta № 1

Por lo que yo sé, establecer la Width de un StackPanel con Orientation="Horizontal" no tendrá efecto El tamaño de un StackPanel No excede el tamaño de su contenido en su dirección orientada.

¿Por qué tienes que "usar" StackPanels aqui Casi seguro que quieres DockPanels, dado tu objetivo. Usted no tendrá que atar o establecer nada, porque la DockPanel llenará la celda automáticamente.


0 para la respuesta № 2

Intente enlazar el Ancho real en lugar del Ancho.

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<Grid x:Name="resizeGrid"
Grid.Column="0" Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition x:Name="leftColumn"
Width="{Binding ElementName=contentPanel, Path=ActualWidth}" />
<ColumnDefinition x:Name="rightColumn"
Width="*" />
</Grid.ColumnDefinitions>
</Grid>


<StackPanel x:Name="contentPanel"
Grid.Column="0" Grid.Row="0" HorizontalAlignment="Left" >
<StackPanel Background="Yellow" Width="100" Height="25" />
<StackPanel Background="Green" Width="120" Height="25" />
<StackPanel Background="Red" Width="140" Height="25" />
<TextBlock Background="Gray" Text="{Binding ElementName=contentPanel, Path=ActualWidth}" />
</StackPanel>
</Grid>

Los siguientes cambios que he hecho anteriormente:
1) Establecer el leftColumn al ActualWidth del contentPanel
2) Establecer el rightColumn a *
3) contentPanel La alineación horizontal debe cambiarse de otra manera. Stretch. Aquí lo he cambiado a Left

HTH


0 para la respuesta № 3

He encontrado una solución para este problema. (Lo siento por la respuesta tardía)

Lo que hice fue cortar y pegar el control de cuadrícula "resizeGrid" en el panel de contenido "Panel de contenido".

Como mencioné anteriormente, los contenidos dentro delcontentPanel se genera a través de una transformación XSLT y esto seguramente crea un problema de referencia de espacio de nombres. Noté el mensaje "elemento no encontrado ..." en la ventana de salida cada vez que esta ventana está cargada, esto demostró ser correcto.

Insertar el "resizeGrid" en el "contentPanel" ayudó porque entonces ambos controles están dentro del mismo espacio de nombres y pueden ser referenciados para un PropertyBinding usando el atributo "ElementName".

¡Gracias por tu apoyo! :-)