我希望能够绘制到TextBlock的顶部,并找到了一种方法来完成此操作,但是一旦图形出现,我就无法删除它。这是代码。WPF:在TextBlock顶部绘图
public class DerivedTextBlock : TextBlock {
public Boolean DrawExtra {
get { return (Boolean)GetValue(DrawExtraProperty); }
set { SetValue(DrawExtraProperty, value); }
}
// Using a DependencyProperty as the backing store for DrawExtra. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DrawExtraProperty =
DependencyProperty.Register("DrawExtra", typeof(Boolean), typeof(DerivedTextBlock), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsArrange));
public DrawingVisual DrawingVisual { get; set; }
public DerivedTextBlock() {
DrawingVisual = this.CreateDrawingVisualRectangle();
}
protected override int VisualChildrenCount {
get {
//if we want to draw our extra info, add one to
// our visualChildrenCount, usually with a textblock it is 0
if (DrawExtra) {
return base.VisualChildrenCount + 1;
}
else {
return base.VisualChildrenCount;
}
}
}
protected override Visual GetVisualChild(int index) {
return DrawingVisual;
}
// Create a DrawingVisual that contains a rectangle.
private DrawingVisual CreateDrawingVisualRectangle() {
DrawingVisual drawingVisual = new DrawingVisual();
// Retrieve the DrawingContext in order to create new drawing content.
DrawingContext drawingContext = drawingVisual.RenderOpen();
// Create a rectangle and draw it in the DrawingContext.
Rect rect = new Rect(new Point(10.0, 0), new Size(10.0/2.0, 10));
drawingContext.DrawRectangle(Brushes.LightBlue, (Pen)null, rect);
// Persist the drawing content.
drawingContext.Close();
return drawingVisual;
}
}
我想这样做的原因:我们有一个包含很多单元格的数据网格,每个单元格都显示文本。我们在单元上显示一些验证信息,我们通过使用带有textblock和网格中的某些路径hosten的模板来实现此目的。这增加了额外的元素到可视化树中,当我们必须重新绘制(加载,切换窗口或排序)时,视觉树中的元素越多,花费的时间就越长。当它只是一个文本块时,比用网格控制要快大约1/3 - 1/2。所以我们想在文本框的顶部绘制我们的验证内容。
我试过AddVisualChild(),它似乎它被忽略的TextBlock,所以我上面的解决方案是一个破解。 – 2010-06-24 07:58:47
我刚刚尝试了您的代码,并提供了我所建议的更改,并且工作完美。然后,我为DrawExtra属性制作了一个动画,并获得了一个闪烁的蓝色小框。 – 2010-06-24 08:30:44
完全神奇,非常感谢! – 2010-06-24 23:10:24