2010-03-31 22 views
1
public class VisualCue : FrameworkElement 
{ 
    public List<Indicator> Indicators { get; set; } 

    public VisualCue() 
    { 
     this.Indicators = new List<Indicator>(); 
    } 

    protected override int VisualChildrenCount 
    { 
     get { return this.Indicators.Count; } 
    } 

    protected override Visual GetVisualChild(int index) 
    { 
     return this.Indicators[index]; 
    } 
} 

public class Indicator : FrameworkElement 
{ 
    protected override void OnRender(DrawingContext context) 
    { 
     context.DrawEllipse(Brushes.Red, 
      new Pen(Brushes.Black, 2), new Point(0, 0), 10, 10); 

     base.OnRender(context); 
    } 
} 

而在XAML中的FrameworkElement的:繪圖的FrameworkElement的

<local:VisualCue x:Name="visualCue"> 
<local:VisualCue.Indicators> 
    <local:Indicator /> 
</local:VisualCue.Indicators> 
</local:VisualCue> 

但是指示燈沒有拿得出。我錯過了什麼?

回答

0

至少,你需要重寫ArrangeOverride在VisualCue:

protected override Size ArrangeOverride(Size finalSize) 
{ 
    foreach (Indicator indicator in Indicators) 
    { 
     indicator.Arrange(new Rect(0, 0, 10, 10)); 
    } 

    return finalSize; 
} 

在矩形中的值傳遞給孩子們指標取決於你的佈局需要。您也應該重寫MeasureOverride。

FrameworkElement.ArrangeOverride method

FrameworkElement.MeasureOverride method

+0

是的,值得檢查wpf中的渲染細節,如度量和安排步驟,如斯科特所說.. http://msdn.microsoft.com/en-us/library/ms745058.aspx – Charleh 2012-07-01 14:43:03

1

您是否嘗試過實施LogicalChildren方法?

protected override IEnumerator LogicalChildren 
{ 
    get { return indicators.GetEnumerator(); } 
} 

當我開發第一個'FrameworkElement`時,我遇到了各種各樣的麻煩。

廣泛的研究後,我發現基本上有一些方法你,以便它與WPF發揮很好覆蓋。

相關問題