Compartir a través de


FrameworkElement.ArrangeOverride(Size) Método

Definición

Proporciona el comportamiento del paso "Organizar" del diseño. Las clases pueden invalidar este método para definir su propio comportamiento de paso "Organizar".

protected:
 virtual Size ArrangeOverride(Size finalSize) = ArrangeOverride;
Size ArrangeOverride(Size const& finalSize);
protected virtual Size ArrangeOverride(Size finalSize);
function arrangeOverride(finalSize)
Protected Overridable Function ArrangeOverride (finalSize As Size) As Size

Parámetros

finalSize
Size

Área final dentro del elemento primario que este objeto debe usar para organizarse y sus elementos secundarios.

Devoluciones

Tamaño real que se usa después de organizar el elemento en el diseño.

Ejemplos

En este ejemplo se implementa ArrangeOverride para personalizar la lógica de paso "Organizar" para una implementación de panel personalizada. Tenga en cuenta, en particular, estos aspectos del código:

  • Recorre en iteración los elementos secundarios.
  • Para cada elemento secundario, llama a Arrange, mediante un rect donde Height y Width se basan en DesiredSize, y X e Y se basan en la lógica específica del panel.
  • Devuelve su tamaño (en este caso, este panel simple devuelve un tamaño fijo en lugar de un tamaño calculado al acumular las medidas de valor rect organizadas).
// Second arrange all children and return final size of panel
protected override Size ArrangeOverride(Size finalSize)
{
    // Get the collection of children
    UIElementCollection mychildren = Children;

    // Get total number of children
    int count = mychildren.Count;

    // Arrange children
    // We're only allowing 9 children in this panel.  More children will get a 0x0 layout slot.
    int i;
    for (i = 0; i < 9; i++)
    {

        // Get (left, top) origin point for the element in the 3x3 block
        Point cellOrigin = GetOrigin(i, 3, new Size(100, 100));

        // Arrange child
        // Get desired height and width. This will not be larger than 100x100 as set in MeasureOverride.
        double dw = mychildren[i].DesiredSize.Width;
        double dh = mychildren[i].DesiredSize.Height;

        mychildren[i].Arrange(new Rect(cellOrigin.X, cellOrigin.Y, dw, dh));

    }

    // Give the remaining children a 0x0 layout slot
    for (i = 9; i < count; i++)
    {
        mychildren[i].Arrange(new Rect(0, 0, 0, 0));
    }


    // Return final size of the panel
    return new Size(300, 300);
}
'Second arrange all children and return final size of panel 
Protected Overrides Function ArrangeOverride(ByVal finalSize As Size) As Size
    'Get the collection of children 
    Dim mychildren As UIElementCollection = Children
    'Get total number of children 
    Dim count As Integer = mychildren.Count
    'Arrange children 
    'only allowing 9 children in this panel. More children will get a 0x0 layout slot. 
    Dim i As Integer
    For i = 0 To 8
        'Get (left, top) origin point for the element in the 3x3 block 
        Dim cellOrigin As Point = GetOrigin(i, 3, New Size(100, 100))
        'Arrange child 
        'Get desired height and width. This will not be larger than 100x100 as set in MeasureOverride. 
        Dim dw As Double = mychildren(i).DesiredSize.Width
        Dim dh As Double = mychildren(i).DesiredSize.Height
        mychildren(i).Arrange(New Rect(cellOrigin.X, cellOrigin.Y, dw, dh))
    Next
    For i = 9 To count - 1
        'Give the remaining children a 0x0 layout slot 
        mychildren(i).Arrange(New Rect(0, 0, 0, 0))
    Next
    'Return final size of the panel 
    Return New Size(300, 300)
End Function
'Calculate point origin of the Block you are in 
Protected Function GetOrigin(ByVal blockNum As Integer, ByVal blocksPerRow As Integer, ByVal itemSize As Size) As Point
    'Get row number (zero-based) 
    Dim row As Integer = CInt(Math.Floor(blockNum / blocksPerRow))
    'Get column number (zero-based) 
    Dim column As Integer = blockNum - blocksPerRow * row
    'Calculate origin 
    Dim origin As New Point(itemSize.Width * column, itemSize.Height * row)
    Return origin
End Function

Comentarios

Este método tiene una implementación predeterminada que realiza el diseño integrado para la mayoría de las clases derivadas de FrameworkElement . ArrangeOverride proporciona el comportamiento de Arrange, cada vez que se llama a Arrange por lógica de diseño interna o por el código de su propia aplicación, incluidos los métodos ArrangeOverride propios para otras clases. Si va a generar un control con plantilla, la lógica ArrangeOverride define la lógica de diseño de paso "Organizar" específica del control.

El diseño general de cómo los elementos pasan por un proceso de diseño cuando la aplicación se ejecuta se divide en dos pasos: un pase "Measure" y, a continuación, un pase "Arrange". Los autores de controles (o autores de paneles) que quieran personalizar el paso "Organizar" del procesamiento de diseño deben invalidar ArrangeOverride. El patrón de implementación debe llamar a Arrange en cada objeto secundario visible y pasar el tamaño deseado final para cada objeto secundario como parámetro finalRect . Si no se llama a Arrange , el objeto secundario no se representa.

Varias clases no selladas existentes proporcionan implementaciones de invalidación de este método. Entre los destacados se incluyen StackPanel y Grid. Normalmente, el comportamiento de ArrangeOverride genera un valor finalSize que no infringe los valores definidos por el usuario que se colocan en el propio contenedor de diseño. Por ejemplo, el valor de finalSize no suele ser mayor que el altoy ancho del contenedor, teniendo en cuenta los valores Margin o Padding que afectan al área de contenido. Los controles que tienen específicamente un escenario para superar el tamaño del contenedor podrían devolver un valor mayor, pero cualquier usuario que use ese control debe tener en cuenta los problemas de recorte y posicionamiento resultantes de él. El valor que pasa una implementación ArrangeOverride a Arrange para cada objeto secundario suele ser el valor establecido en DesiredSize por la llamada a Measure anterior.

Se aplica a

Consulte también