使用Visuals将WPF控件(ComboBox)放入画布

时间:2010-03-08 22:51:34

标签: c# wpf canvas

我正在编写WPF图表并使用Visuals来提高性能。代码如下:

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 );
    }

但它不起作用,没有显示ComboBox。我缺少什么?

3 个答案:

答案 0 :(得分:1)

您是否考虑过将ComboBox与DrawingCanvas2一起放在容器Panel中,并根据z-order放在DrawingCanvas2之上?

通过这种方式,您的DrawingCanvas2可以专注于绘制视觉效果,而您的ComboBox将表现为开箱即用。

答案 1 :(得分:1)

Canvas将从其Children属性“获取”其大小(使用MeasureOverride和ArrangeOverride)。由于您只是调用AddVisualChild,因此它不会添加到Children属性中,它仍然认为它是空的。

Children属性是一个UIElementCollection(ComboBox是一个UIElement)

答案 2 :(得分:0)

正确答案是Linda Liu, Microsoft WPF forum,尽管XIU接近它。

代码是:

    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,否则框中的项目不可选择。