Поле текстового блока приводит к выходу текста за границы

В настоящее время я пытаюсь создать визуальный компонент для прокрутки текста (слева направо и справа налево) - в значительной степени html-шатер.

У меня есть сетка, разделенная на несколько столбцов и строк, и я хочу поместить свой компонент в один из слотов сетки.

Сетка (с именем UIGrid) создается следующим образом:

for (int i = 0; i < xDivisions; i++)
{
    ColumnDefinition newColumn = new ColumnDefinition();
    UIGrid.ColumnDefinitions.Add(newColumn);
}
for (int i = 0; i < yDivisions; i++)
{
    RowDefinition newRow = new RowDefinition();
    UIGrid.RowDefinitions.Add(newRow);
}

Компонент, который я добавляю, — это просто граница с дочерним текстовым блоком. Я размещаю границу внутри сетки следующим образом:

border = new Border();
Grid.SetColumn(border, xPosition);
Grid.SetRow(border, yPosition);

textBlock = new TextBlock();
border.Child = textBlock;
textBlock.Text = "Scrolling text from left to right";

UIGrid.Children.Add(border);

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

textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
double textWidth = textBlock.DesiredSize.Width;
double visibleWidth = componentBase.ActualWidth;
double targetMargin = textWidth < visibleWidth ? visibleWidth : textWidth;

if (margin.Left == targetMargin)
{
    margin.Left = -textWidth;
} else
{
    margin.Left++;
}

Когда текст скользит слева направо, он ведет себя хорошо: https://s10.postimg.org/p0nt7vl09/text_good.png Текст, «выходящий» из слота сетки, скрыт.

Однако, когда я устанавливаю поле текстового блока отрицательным, чтобы он мог вернуться в видимую область слева, текст виден, даже если он находится за пределами выделенного слота: https://s10.postimg.org/pownqtjq1/text_bad.png

Вместо этого я пытался использовать заполнение, но не могу установить отрицательное заполнение. Я пробовал несколько других вещей, но я чувствую, что столкнулся с препятствием.

Что я могу сделать, чтобы получить красиво прокручиваемый текст?


person Valentin Schneider    schedule 11.08.2016    source источник
comment
Было бы неплохо, если бы вы опубликовали xaml сетки, чтобы мы могли видеть, что именно происходит. а пока попробуйте установить горизонтальное выравнивание текстового блока внутри сетки на Stretch   -  person AVK    schedule 11.08.2016
comment
@AVKNaidu Изменение горизонтального выравнивания текстового блока или границы не изменило поведение прокрутки =(   -  person Valentin Schneider    schedule 11.08.2016
comment
Я хотел бы знать, почему вы, люди, так параноидально относитесь к обмену кодом или ясно говорите, в чем ваша настоящая проблема. В любом случае, найдите свой внешний элемент управления (я думаю, это может быть сетка) и установите для него ClipToBounds="True". Это может решить, по крайней мере, часть вашей проблемы, хотя трудно быть уверенным, поскольку вы очень скрытны.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 11.08.2016
comment
@EdPlunkett О, на самом деле это не секретность, я просто не хочу выгружать весь свой код и говорить здесь, отладьте это, пожалуйста. Я признаю, что мог бы показать здесь больше кода, минус баллы для меня. Что касается «ClipToBounds», похоже, в UWP нет такого свойства, только свойство «Clip», представляющее собой прямоугольник, который я должен установить сам. Я все еще борюсь с этим.   -  person Valentin Schneider    schedule 12.08.2016


Ответы (2)


Если вы хотите красиво прокручивать текст, ListView может быть лучшим вариантом. Он динамический, и вы можете привязать его к своему объекту. Потребовалось бы много работы над этой догадкой.

person Phia-CM    schedule 11.08.2016

Эд Планкетт привел меня в правильном направлении со свойством Clip. Идея состоит в том, чтобы сделать это:

border.Clip = new RectangleGeometry
{
    Rect = new Rect(0, 0, border.ActualWidth, border.ActualHeight)
};

Конечно, это не работает, если граница еще не отрисована (и, конечно же, это не так, когда мой код работает). Вы можете принудительно выполнить измерение, используя «Измерение», как я сделал для измерения длины текста в пикселях, но оно странно вело себя на моей границе. Я бы вообще не подошла по размеру.

В итоге я просто подписался на событие SizeChanged границы:

border.SizeChanged += OnSizeComputed;

Когда это событие запускается, я создаю RectangleGeometry, используя ActualWidth и ActualHeight.

person Valentin Schneider    schedule 12.08.2016