【问题标题】:Drawing a FrameworkElement within another FrameworkElement在另一个 FrameworkElement 中绘制一个 FrameworkElement
【发布时间】:2010-03-31 21:03:59
【问题描述】:
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 中:

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

但指标没有被绘制。我错过了什么?

【问题讨论】:

    标签: wpf drawing frameworkelement


    【解决方案1】:

    您是否尝试过实现LogicalChildren 方法?

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

    当我开发我的第一个“FrameworkElement”时遇到了各种各样的麻烦。

    经过广泛的研究,我基本上发现您必须重写许多方法,以便它可以很好地与WPF 配合使用。

    【讨论】:

      【解决方案2】:

      至少你需要在 VisualCue 中重写 ArrangeOverride:

      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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多