Изменение Custom WrapPanel для добавления функции разрыва строки

Я пытаюсь изменить решение, найденное здесь, чтобы иметь отдельный метод, который будет вставлять разрыв строки.

То, что я смог сделать до сих пор, очень хакерское, но я в основном вставил тип элемента управления, который я не использую, в WrapPanel, и оттуда я поиграл с желаемыми значениями размера, чтобы заставить панель думать, что пришло время обернуть содержание.

protected override Size MeasureOverride(Size constraint)
{
    Size curLineSize = new Size();
    Size panelSize = new Size();

    UIElementCollection children = base.InternalChildren;

    for (int i = 0; i < children.Count; i++)
    {
        UIElement child = children[i] as UIElement;

        // Flow passes its own constraint to children
        child.Measure(constraint);
        Size sz = child.DesiredSize;

        if (child.GetType() == typeof(TextBlock))
        {
            sz.Width = constraint.Width + 1;
        }

        if (curLineSize.Width + sz.Width > constraint.Width) //need to switch to another line
        {
            panelSize.Width = Math.Max(curLineSize.Width, panelSize.Width);
            panelSize.Height += curLineSize.Height;
            curLineSize = child.DesiredSize;

            if (sz.Width > constraint.Width) // if the element is wider then the constraint - give it a separate line                    
            {
                sz = child.DesiredSize;
                panelSize.Width = Math.Max(sz.Width, panelSize.Width);
                panelSize.Height += sz.Height;
                curLineSize = new Size();
            }
        }
        else //continue to accumulate a line
        {
            curLineSize.Width += sz.Width;
            curLineSize.Height = Math.Max(sz.Height, curLineSize.Height);
        }
    }

    // the last line size, if any need to be added
    panelSize.Width = Math.Max(curLineSize.Width, panelSize.Width);
    panelSize.Height += curLineSize.Height;

    return panelSize;
}

Важными строками являются if (child.GetType() == typeof(TextBLock)), sz.Width = constraint.Width + 1;, и оттуда я изменил curLineSize = child.DesiredSize; на 'curLineSize = child.DesiredSizeto keep in consistent with original code. Finally, I also setsz = child.DesiredSize;`, чтобы сохранить эту часть согласованной.

Я знаю, что это очень хакерски, поэтому я пытался создать какой-то метод, который можно вызвать и просто вставить разрыв строки, но мне не повезло.


person Jackie Jones    schedule 01.12.2017    source источник
comment
Я не уверен, правильно ли я вас понял... скажем, у вас есть два текстовых элемента, которые должны отображаться на панели обтекания. Есть несколько возможных случаев: (1) оба помещаются в одну строку (2) оба помещаются в отдельные строки (3) для элемента 1 требуется ширина больше, чем доступно (4) для элемента 2 требуется ширина больше, чем доступно (5) для каждого элемента требуется больше ширины, чем есть в наличии. Не могли бы вы подробно объяснить, как вы ожидаете получить результирующий макет текста в каждом случае (особенно 3, 4, 5)?   -  person grek40    schedule 01.12.2017
comment
@ grek40 То, как используется WrapPanel, немного странное, но в основном оно вставляет по 1 букве за раз в качестве нового элемента управления. Я хочу иметь возможность видеть, когда в предложении есть символ '\n', а затем добавлять разрыв строки, чтобы слово не имело 1 буквы в верхней строке и продолжалось на следующей строке.   -  person Jackie Jones    schedule 01.12.2017
comment
У меня нет непосредственной идеи для решения, и, честно говоря, я чувствую, что это будет решено по-другому, если вы сосредоточитесь на своем требовании, а не на своей попытке хакерского решения;)   -  person grek40    schedule 01.12.2017
comment
По сути, сначала объясните, почему <TextBlock TextWrapping="Wrap" TextAlignment="Center">My Text...</TextBlock> не соответствует вашим требованиям.   -  person grek40    schedule 01.12.2017
comment
Элементы управления, добавленные на панель обтекания, на самом деле являются сетками, где каждая сетка представляет собой букву. Единственная причина проверки TextBlock заключается в том, что ее нет (и не будет) на панели переноса.   -  person Jackie Jones    schedule 01.12.2017
comment
Это не объясняет, почему сетка и все остальное нужно для отображения буквы. Вы не можете оправдать часть A вашего текущего подхода частью B вашего текущего подхода, если весь подход подвергается сомнению :)   -  person grek40    schedule 01.12.2017
comment
Что ж, в проекте более или менее просто я бездельничаю и создаю свои собственные пиксельные буквы. Я знаю, что могу скачать бесплатный пользовательский шрифт или найти его, но я просто экспериментирую с разными вещами, если честно.   -  person Jackie Jones    schedule 01.12.2017