将WPF控件(ComboBox)放入带有Visuals的画布中

4

我正在编写一个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显示。我错过了什么?

你的图表控件有什么超级功能,银光图表工具包控件没有的吗? - AnthonyWJones
顺便问一下,这是WPF还是Silverlight? - AnthonyWJones
这是WPF(我认为在Silverlight中功能是相同的)。 - Mikhail Poda
为什么你不使用现有的图表工具(WPF也提供了图表控件)呢? - AnthonyWJones
@Anthony:这是一个业余项目,我通过这种方式学习WPF。 - Mikhail Poda
3个回答

1
你有考虑将ComboBox放在一个容器Panel中,与DrawingCanvas2一起,并在z-order方面置于DrawingCanvas2之上吗?
这样,你的DrawingCanvas2就可以集中于绘制视觉效果,而你的ComboBox则可以按照默认方式进行操作。

有趣的方法,它有效了。我将DrawingCanvas2ComboBox都放在了Canvas里面。 - Mikhail Poda

1

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

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


0

正确答案是由林达刘,微软WPF论坛提供的,尽管修也接近了。

代码如下:

    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,否则该框中的项目将无法选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接