FrameworkElement.ArrangeOverride(Size) Metode

Definisi

Menyediakan perilaku untuk pass tata letak "Atur". Kelas dapat mengambil alih metode ini untuk menentukan perilaku pass "Arrange" mereka sendiri.

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

Parameter

finalSize
Size

Area akhir dalam induk yang harus digunakan objek ini untuk mengatur dirinya sendiri dan anak-anaknya.

Mengembalikan

Ukuran aktual yang digunakan setelah elemen diatur dalam tata letak.

Contoh

Contoh ini mengimplementasikan ArrangeOverride untuk menyesuaikan logika pass "Arrange" untuk implementasi panel kustom. Perhatikan secara khusus aspek kode ini:

  • Iterasi atas anak-anak.
  • Untuk setiap anak, panggilan Mengatur, menggunakan Rect di mana Tinggi dan Lebar didasarkan pada DesiredSize, dan X dan Y didasarkan pada logika yang khusus untuk panel.
  • Mengembalikan ukurannya (dalam hal ini, panel sederhana ini mengembalikan ukuran tetap daripada ukuran yang dihitung pada akumulasi pengukuran nilai Rect yang diatur).
// 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

Metode ini memiliki implementasi default yang melakukan tata letak bawaan untuk sebagian besar kelas turunan FrameworkElement . ArrangeOverride menyediakan perilaku untuk Pengaturan, setiap kali Atur dipanggil baik dengan logika tata letak internal atau kode aplikasi Anda sendiri, termasuk metode ArrangeOverride Anda sendiri untuk kelas lain. Jika Anda menghasilkan kontrol templat, logika ArrangeOverride menentukan logika tata letak pass "Susun" spesifik kontrol Anda.

Desain umum tentang bagaimana elemen melalui proses tata letak saat aplikasi Anda berjalan dibagi menjadi dua langkah: pass "Measure", lalu pass "Arrange". Penulis kontrol (atau penulis panel) yang ingin menyesuaikan kode "Susun" pemrosesan tata letak harus mengambil alih ArrangeOverride. Pola implementasi harus memanggil Atur pada setiap objek anak yang terlihat, dan melewati ukuran akhir yang diinginkan untuk setiap objek anak sebagai parameter finalRect . Jika Atur tidak dipanggil, objek anak tidak dirender.

Beberapa kelas yang tidak disegel yang ada memberikan implementasi penimpaan dari metode ini. Yang menonjol termasuk StackPanel dan Grid. Biasanya, perilaku ArrangeOverride menghasilkan finalSize yang tidak melanggar nilai yang ditentukan pengguna yang ditempatkan pada kontainer tata letak itu sendiri. Misalnya, finalSize biasanya tidak lebih besar dari Tinggi dan Lebar kontainer, akuntansi untuk nilai Margin atau Padding yang memengaruhi area konten. Kontrol yang secara khusus memiliki skenario untuk melebihi ukuran kontainer dapat mengembalikan nilai yang lebih besar, tetapi siapa pun yang menggunakan kontrol tersebut harus mempertimbangan masalah kliping dan penempatan yang dihasilkan darinya. Nilai yang diteruskan implementasi ArrangeOverride ke Atur untuk setiap objek anak umumnya adalah nilai yang diatur dalam DesiredSize oleh panggilan Pengukuran sebelumnya.

Berlaku untuk

Lihat juga