代码之家  ›  专栏  ›  技术社区  ›  Mikhail Poda

将WPF控件(ComboBox)放入画布中

  •  4
  • Mikhail Poda  · 技术社区  · 14 年前

    我正在写一个WPF图表,并使用视觉效果来实现性能。代码如下:

    public class DrawingCanvas2 : Canvas
    {
        private List<Visual> _visuals = new List<Visual>();
    
        protected override Visual GetVisualChild( int index ) { return _visuals[index]; }
        protected override int VisualChildrenCount { get { return _visuals.Count; } }
    
        public void AddVisual( Visual visual )
        {
            _visuals.Add( visual );
    
            base.AddVisualChild( visual );
            base.AddLogicalChild( visual );
        }
    }
    

    旁边 DrawingVisual 元素(行、文本)我需要 ComboBox 在图表中。所以我试了一下:

        public DrawingCanvas2()
        {
            ComboBox box = new ComboBox();
            AddVisual( box );
    
            box.Width = 100;
            box.Height = 30;
    
            Canvas.SetLeft( box, 10 );
            Canvas.SetTop( box, 10 );
        }
    

    但它不起作用,没有显示组合框。我错过了什么?

    3 回复  |  直到 14 年前
        1
  •  1
  •   micahtan    14 年前

    您是否考虑将组合框与DrawingCanvas2一起放在容器面板内,并按Z顺序放在DrawingCanvas2的顶部?

    这样,您的DrawingCanvas2就可以集中精力绘制视觉效果,而组合框也会表现得不拘一格。

        2
  •  1
  •   XIU    14 年前

    画布将从其子属性“获取”其大小(使用MeasureOverride和ArrangeOverride)。因为您只是调用addVisualChild,所以它不会添加到Children属性中,而且它仍然认为它是空的。

    子属性是uielementCollection(组合框是uielement)

        3
  •  0
  •   Mikhail Poda    14 年前

    正确的答案是 Linda Liu, Microsoft WPF forum 尽管秀很接近。

    代码是:

        public DrawingCanvas2() : base()
        {
            ComboBox box = new ComboBox();
            AddVisual( box );
    
            Size outputSize = new Size( 100, 20 );
    
            box.Measure( outputSize );
            box.Arrange( new Rect( outputSize ) );
            box.UpdateLayout();
    
            box.Items.Add( "hello1" );
            box.Items.Add( "hello2" );
            box.Items.Add( "hello3" );
    
            box.SelectedIndex = 1;
        }
    

    重要的是要注意 box.SelectedIndex 必须显式设置为不 -1 ,否则框中的项目不可选择。