繁体   English   中英

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

[英]Putting WPF Control (ComboBox) into canvas with Visuals

我正在编写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。 我缺少什么?

您是否考虑过将ComboBox与DrawingCanvas2一起放在容器Panel的内部,并按照z顺序放在DrawingCanvas2的顶部?

这样,您的DrawingCanvas2可以专注于绘图视觉效果,并且ComboBox可以开箱即用。

画布将从其子级属性中“获取”其大小(使用MeasureOverride和ArrangeOverride)。 由于您仅调用AddVisualChild,因此不会将其添加到Children属性中,并且仍然认为它为空。

Children属性是一个UIElementCollection(组合框是一个UIElement)

正确的答案是Microsoft WPF论坛Linda Liu提出的 ,尽管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必须显式设置为not -1 ,否则box中的项目是不可选择的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM