Я хочу, чтобы иметь возможность рисовать на вершине 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;
}
}
Причина Я хочу сделать это: у нас есть набор данных с большим количеством ячеек, каждая ячейка отображает текст. мы показываем некоторую информацию о проверке на ячейках, и мы делаем это, используя шаблон с текстовым блоком и некоторыми хостами-хостами в сетке. накладные расходы на это добавляют дополнительные элементы к визуальному дереву, и когда нам приходится перерисовывать (при загрузке, переключении окон или в сортировке), требуется намного больше элементов в визуальном дереве. когда это всего лишь текстовый блок, он примерно на 1/3 - 1/2 быстрее, чем управление с сеткой. Поэтому мы хотели бы нарисовать наш материал для проверки прямо поверх текстового поля.
Я попробовал AddVisualChild(), и кажется, что он игнорируется для TextBlock, поэтому мое решение выше - это взломать. –
Я просто попробовал свой код с изменениями, которые я предложил, и он отлично работал. Затем я анимировал свойство DrawExtra и получил небольшую мигающую синюю коробку. –
полностью волшебство, спасибо! –