Как сделать из приведенного ниже элемента управления содержание в холсте? - PullRequest
0 голосов
/ 29 сентября 2019

Я использую эту программу: https://www.codeproject.com/Articles/24681/WPF-Diagram-Designer-Part-4 и немного ее изменяю, чтобы создать новую программу для рисования графика (математического графика), но не завершенную. для каждого DesignerItem я добавляю Text as Adorner (класс TextAdorner), вы можете увидеть это по адресу: [2 https://i.stack.imgur.com/VDvGQ.png

, но когда два или более DesignerItems перекрывают весь текст, смешанный вместе, потому что Adorner является верхним из всехDesignerItems в холсте. [1

Есть ли способ сделать рекламный элемент ниже элемента DesignerItem на холсте?

Ниже представлен класс TextAdorner.

    class TextAdorner : Adorner 
{
    VisualCollection _visualChildren;
    Path _textGeometry;
    TexFormula formula;
    TexFormulaParser parser;

    public Brush ForeColor
    { get; set; }

    public double FontSize
    { get; set; }
    public TextAdorner(UIElement adornedElement)
       : base(adornedElement)
    {
        _visualChildren = new VisualCollection(this);
        this.Tag = @"v^{b_i}_{c_j}";
        parser = new TexFormulaParser();
        formula = parser.Parse(this.Tag.ToString());
        _textGeometry=new Path();
        this.ForeColor = Brushes.Black;
        this.FontSize = 32;
        _textGeometry.Fill = this.ForeColor;
        _textGeometry.Stroke = this.ForeColor;
        _textGeometry.StrokeThickness = 1;
        _visualChildren.Add(_textGeometry);
        this.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        double _left;
        double _top;
        _textGeometry.Data = formula.GetRenderer(TexStyle.Display, this.FontSize, "Times New Roman").RenderToGeometry(0, 0);
        switch (this.HorizontalAlignment)
        {
            case System.Windows.HorizontalAlignment.Left:
                {
                    _left = 0;
                    break;
                }
            case System.Windows.HorizontalAlignment.Right:
                {
                    _left = AdornedElement.RenderSize.Width - _textGeometry.RenderedGeometry.Bounds.Width;
                    break;
                }
            default:
                {
                    _left = AdornedElement.RenderSize.Width / 2 - _textGeometry.RenderedGeometry.Bounds.Width / 2;
                    break;
                }
        }
        switch (this.VerticalAlignment)
        {
            case System.Windows.VerticalAlignment.Top:
                {
                    _top = 0;
                    break;
                }
            case System.Windows.VerticalAlignment.Bottom:
                {
                    _top = AdornedElement.RenderSize.Height- _textGeometry.RenderedGeometry.Bounds.Height;
                    break;
                }
            default: 
                {
                    _top = AdornedElement.RenderSize.Height / 2 - _textGeometry.RenderedGeometry.Bounds.Height/ 2;
                    break;
                }
        }
        Rect _leftTopRect = new Rect(_left,_top,AdornedElement.RenderSize.Width,AdornedElement.RenderSize.Height);
        _textGeometry.Arrange(_leftTopRect);
        return finalSize;
    }


    protected override int VisualChildrenCount
    {
        get { return _visualChildren.Count; }
    }

    protected override Visual GetVisualChild(int index)
    {
        return _visualChildren[index];
    }

}
...