Bagikan melalui


UIElement.Arrange(Rect) Metode

Definisi

Memposisikan objek anak dan menentukan ukuran untuk UIElement. Objek induk yang menerapkan tata letak kustom untuk elemen anak mereka harus memanggil metode ini dari implementasi penimpaan tata letaknya untuk membentuk pembaruan tata letak rekursif.

public:
 virtual void Arrange(Rect finalRect) = Arrange;
void Arrange(Rect const& finalRect);
public void Arrange(Rect finalRect);
function arrange(finalRect)
Public Sub Arrange (finalRect As Rect)

Parameter

finalRect
Rect

Ukuran akhir yang dihitung induk untuk anak dalam tata letak, disediakan sebagai nilai Rect .

Contoh

Contoh ini menunjukkan bagaimana Anda akan menggunakan Arrange dalam implementasi ArrangeOverride . Ide dasarnya adalah Anda harus mengkueri DesiredSize pada apa pun yang Anda coba panggil Atur sehingga Anda memiliki nilai untuk finalRect, kecuali implementasi tata letak Anda memiliki beberapa desain khusus yang mengubah atau mengabaikan ukuran yang diinginkan sebelum meneruskannya sebagai finalRect.

// 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

Keterangan

Panggilan Atur berpotensi mencapai implementasi ArrangeOverride dari kelas tertentu tersebut. Jika tidak, sebagian besar kelas FrameworkElement memiliki perilaku tata letak default implisit untuk Susun.

Komputasi penempatan tata letak awal dalam UI XAML terdiri dari panggilan Pengukuran dan panggilan Susun, dalam urutan tersebut. Selama panggilan Ukur , sistem tata letak menentukan persyaratan ukuran elemen menggunakan pengukuran availableSize . Selama panggilan Susun, sistem tata letak menyelesaikan ukuran dan posisi kotak pembatas elemen.

Saat tata letak pertama kali diproduksi, tata letak selalu memiliki panggilan Pengukuran yang terjadi sebelum Atur. Namun, setelah tata letak pertama berlalu, panggilan Atur dapat terjadi tanpa Pengukuran sebelumnya. Ini dapat terjadi ketika properti yang hanya memengaruhi Pengaturan diubah (seperti perataan), atau ketika induk menerima Pengaturan tanpa Pengukuran.

Panggilan Pengukuran akan secara otomatis membatalkan informasi Pengaturan apa pun. Pembaruan tata letak umumnya terjadi secara asinkron (pada satu waktu yang ditentukan oleh sistem tata letak). Elemen mungkin tidak segera mencerminkan perubahan pada properti yang memengaruhi ukuran elemen (seperti Lebar).

Pembaruan tata letak dapat dipaksa oleh kode aplikasi daripada mengandalkan perilaku sistem tata letak bawaan dengan menggunakan metode UpdateLayout . Namun, itu tidak disarankan. Biasanya tidak perlu dan dapat menyebabkan performa yang buruk jika digunakan secara berlebihan. Dalam banyak situasi di mana memanggil UpdateLayout dari kode aplikasi mungkin sesuai karena perubahan pada properti, sistem tata letak mungkin sudah memproses pembaruan. Sistem tata letak juga memiliki pengoptimalan untuk menangani perubahan tata letak kaskade melalui hubungan induk-anak, dan memanggil UpdateLayout dapat bekerja melawan pengoptimalan tersebut. Namun demikian, ada kemungkinan bahwa situasi tata letak ada dalam skenario yang lebih rumit di mana memanggil UpdateLayout adalah opsi terbaik untuk menyelesaikan masalah waktu atau masalah lain dengan tata letak. Cukup gunakan dengan sengaja dan hemat.

Berlaku untuk

Lihat juga