Я пытаюсь изменить решение, найденное здесь, чтобы иметь отдельный метод, который будет вставлять разрыв строки.
То, что я смог сделать до сих пор, очень хакерское, но я в основном вставил тип элемента управления, который я не использую, в 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 set
sz = child.DesiredSize;`, чтобы сохранить эту часть согласованной.
Я знаю, что это очень хакерски, поэтому я пытался создать какой-то метод, который можно вызвать и просто вставить разрыв строки, но мне не повезло.
<TextBlock TextWrapping="Wrap" TextAlignment="Center">My Text...</TextBlock>
не соответствует вашим требованиям. - person grek40   schedule 01.12.2017