2009-02-06 16 views
5

He escrito un control de usuario WPF y parte de esto implica dinámicamente agregar elementos a un lienzo que afecta la altura de dicho lienzo. El lienzo está anidado dentro de una cuadrícula. Cuando agrego dinámicamente mis elementos, la altura del lienzo cambia, pero el lienzo termina extendiéndose más allá del borde del control general en lugar de hacer que el control cambie de tamaño y se haga más alto. ¿Cómo puedo forzar el control para cambiar el tamaño correctamente? Tengo la sensación de que necesito llamar o anular Medir o Organizar pero no estoy teniendo suerte con ninguno de los métodos, posiblemente porque los estoy llamando con parámetros incorrectos o posiblemente porque no son los métodos correctos para llamar.Forzar un control WPF personalizado para cambiar el tamaño correctamente

+0

¿Estás usando Blend en absoluto? –

+0

Llegué a esta pregunta porque yo también estoy * dinámicamente * agregando elementos a un control y no está redimensionando a pesar de que he anulado MeasureOverride (que funciona). El problema es forzar una reorganización de los elementos de IU afectados sobre cada nuevo elemento agregado para que se muevan para acomodar el crecimiento. –

+0

He resuelto mi problema, y ​​parece que el evento ItemsChanged de hecho invalida el diseño y fuerza una actualización. Josh explica con razón que implementar una MeasureOverride personalizada funcionará. –

Respuesta

1

Debe anular el método MeasureOverride de su control y devolver el tamaño deseado (el tamaño de su lienzo) desde allí. Luego, el control principal se redimensionaría para adaptarse a su hijo (si es que puede).

16

Su problema es que los paneles Canvas no cambian de tamaño para ajustarse a su contenido.

Habló de Medir y Arreglar. ¿Está familiarizado con el sistema de diseño de dos pasadas de WPF? Lee este artículo para más información: WPF's Layout System.

Este artículo también describe qué hacen los diferentes paneles para el diseño. Cada tipo de panel es diferente.

En WPF, los elementos primero tienen la oportunidad de determinar qué tamaño tendrán. Los paneles pueden determinar su tamaño en función del tamaño de sus hijos, o pueden solicitar un tamaño fijo independientemente del tamaño de sus hijos. Canvas es un ejemplo de este último.

A continuación se indica a los elementos qué tamaño tendrán y se les pide que organicen ellos mismos y sus hijos.

El tipo de panel Cuadrícula no solo permite filas y columnas, sino que también es muy bueno en el ajuste automático del contenido.

El tipo de StackPanel no se autoesifica en absoluto en la dimensión en la que está orientado, pero se autoescribirá en la otra dimensión.

El lienzo puede tamaño automático para llenar un espacio, pero nunca permite que sus hijos tengan el tamaño automático. Dibuja a sus hijos en las coordenadas especificadas y no le importa qué tan grandes sean.

Sugeriría probar una cuadrícula con una sola fila/columna.

O podría crear una nueva clase Canvas que tenga mejores capacidades de autoescala. Durante la medición, le conviene medir los elementos secundarios y dimensionar su lienzo en consecuencia. Puede encontrar una clase como esta útil en el camino.

Aquí hay un artículo sobre Auto Layout en WPF.

Si desea crear un panel personalizado, aquí hay un tema secundario: Custom Panel Elements.

EDIT: Una cosa más: también puede vincular el ancho/alto del elemento secundario a las propiedades ActualWidth y ActualHeight en el lienzo para que el niño ajuste el tamaño de su elemento primario. Puede usar un convertidor para establecer una proporción de tamaño si es necesario.

0

Puede usar un UniFormGrid para archivar esto.Las columnas del conjunto o fila es igual a 1, de modo que se puede obtener un verticales/horizontales dispuestas artículos

<UniformGrid Columns="1"> 
    <Button Content="Content 1"/> 
    <Button Content="Content 2"/> 
    <Button Content="Content 3"/> 
</UniformGrid> 
2

¿trató de envolver todo (el contenido de su control personalizado) en un Viewbox? por ej.

<UserControl> 
    <Border BorderBrush="Black" BorderThickness="1"> 
     <Viewbox> 
      <Grid> 
       <TextBlock Name="txtDefault" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="16" Foreground="Black" Opacity="0.5" Text="Default" /> 
       <TextBlock Name="txtValue" FontSize="16" Foreground="Black" Visibility="Collapsed" /> 
       <TextBlock Name="txtKey" Grid.Column="1" FontSize="18" Foreground="Black" Visibility="Collapsed" /> 
      </Grid> 
     </Viewbox> 
    </Border> 
</UserControl> 
Cuestiones relacionadas