FrameworkElement.ArrangeOverride(Size) Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
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.