[英]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.