2013-08-22 98 views
0

我正在使用WPF中的自定義控件來實現OnRender,通過調用訪問函數來訪問自己。該控件實現了根據需要繪製線條,圓圈等的訪問者界面。沒有兒童控制。WPF:自定義控件佈局

這一切都有效,當控件呈現時,我可以看到從我的OnRender調用渲染的原語。

但是,我正在努力控制由此產生的佈局。 Image控件完全符合我想要的。我如何複製該行爲?具體來說:

  • 如果用戶沒有指定寬度或高度,我想要設置控件的渲染寬度/高度(無論是在我的構造函數中還是來自控制佈局的其他函數)。
  • 如果用戶將寬度或高度設置爲特定值,我想對圖形進行變換,以保持控件和圖形的高寬比。

我想使用MeasureOverride函數來實現我想要的行爲,但我沒有得到任何結果。我的控制是以零寬度/高度佈置的,然後我所有的繪圖都會繪製在相鄰控件的頂部。下面是我想到目前爲止,希望這說明了什麼,我試圖做的:

protected override Size MeasureOverride(Size constraint) 
{ 
    SymbolLayout symbol = new SymbolLayout(this); 
    component.LayoutSymbol(symbol); 

    Point b1 = MapToPoint(symbol.LowerBound); 
    Point b2 = MapToPoint(symbol.UpperBound); 
    return new Size(b2.X - b1.X, b2.Y - b1.Y); 
} 

我甚至不能肯定的MeasureOverride是正確的功能使用來完成這個...

回答

0

您還需要重寫ArrangeOverride方法。 WPF中的佈局是通過一對遞歸操作Measure和Arrange來執行的。測量只是詢問可視樹所需的所有子控件的大小。這是遞歸完成的,所以如果你有子控件,你需要在所有的子元素上作爲Measure Override的一部分來調用Measure。排列是框架告訴控件實際獲得多少空間的第二步。像測量一樣,這是遞歸完成的,並且通常需要爲每個子控件調用Arrange(如果有)。