FrameworkElement.ArrangeOverride(Size) Método
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
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.