WPF繼承自Panel和繼承自ContentControl的區別
阿新 • • 發佈:2018-11-14
WPF繼承自Panel和繼承自ContentControl的區別(自定義元素)
首先,繼承自Panel或繼承自ContentControl的類,通過XAML將之引用,將存在於最終的XAML樹(VISUAL TREE)中。從樹形結構看,繼承自ContentControl的類下將自動新增ContentPresenter
這個節點,而繼承自Panel
的類只有類本身,若通過ControlTemplate
重寫了此類的Visual Tree
結構,其下的元素也是不能渲染到UI上的,除非模板中添加了ContentPresenter
,但這影響了樹的結構。為了將整個元素,包括其子元素顯示出來,要多增加一個子節點。
事實上,我們可以通過重寫panel
類的ArrangeOverride
,MeasureOverride
方法來讓我們的元素顯示出來,而不必借住ContentPresenter
。這兩個方法的意義是,在控制元件渲染前,向父元素申請一塊空間用來顯示控制元件自己。最終顯示成什麼樣子完全由父元素的安排決定。例如,控制元件想申請一塊寬100,高100的空間顯示自己,最終安排的結果是在(0,0)的位置分到寬50,高50的空間。雖然沒有達到自己的期望,控制元件仍不得不做出妥協。妥協的結果就是在(0,0)位置以分到的寬高顯示自己,說是被裁剪掉也無不可。MeasureOverride
就是申請空間的過程,ArrangeOverride
protected override Size ArrangeOverride(Size availableSize)
{
foreach (UIElement item in this.InternalChildren)
{
item.Arrange(new Rect(10, 0, 0.8, 200));
}
return availableSize;
}
protected override Size MeasureOverride(Size finalSize)
{
foreach (UIElement item in this.InternalChildren)
{
item.Measure(new Size(100, 200));
}
return finalSize;
}