1. 程式人生 > >WPF繼承自Panel和繼承自ContentControl的區別

WPF繼承自Panel和繼承自ContentControl的區別

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; }