2010-03-31 6 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; 
} 

Значения в Rect передаются детям Показатель зависит от ваших потребностей макета. Вы также должны переопределить MeasureOverride.

FrameworkElement.ArrangeOverride method

FrameworkElement.MeasureOverride method

+0

Yep стоит проверить детали рендеринга в wpf, как мера, и организовать шаги, как сказал Скотт. Http://msdn.microsoft.com/en-us/library/ms745058.aspx – Charleh

1

Вы пробовали реализации метода LogicalChildren?

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

У меня были все виды неприятностей, когда я разработал свой первый «FrameworkElement».

После обширных исследований я в основном обнаружил, что существует ряд методов: имеет, чтобы переопределить его, чтобы он хорошо играл с WPF.