我正在编写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。我缺少什么?
答案 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
,否则框中的项目不可选择。