文本块边距导致文本越界
本文关键字:文本 越界 | 更新日期: 2023-09-27 18:02:03
我正在尝试创建一个视觉组件来滚动文本(从左到右和从右到左)-几乎是一个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);
}
我要添加的组件只是一个带有textblock作为子元素的边框。我将边框放入Grid中,如下所示:
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文本"离开"网格槽是隐藏的。
然而,当我设置textblock的边距为负时,它可能会从左边回到可见区域内,即使它在分配的槽之外,文本也是可见的:https://s10.postimg.org/pownqtjq1/text_bad.png
我已经尝试使用填充代替,但我不能设置负填充。我也试过一些其他的方法,但我觉得我遇到了障碍。
我怎么做才能得到一个漂亮的滚动文本
如果你想很好地滚动文本ListView可能是一个更好的选择。它是动态的,你可以将它绑定到你的对象。这需要大量的猜测。
Ed Plunkett用Clip属性为我指明了正确的方向。思路是这样的:
border.Clip = new RectangleGeometry
{
Rect = new Rect(0, 0, border.ActualWidth, border.ActualHeight)
};
当然,如果边框还没有渲染,这是行不通的(当然,当我的代码正在运行时,这是行不通的)。你可以使用"测量"来强制测量,就像我测量文本长度(以像素为单位)一样,但它在我的边框上表现得很奇怪。我根本不会得到正确的尺寸。
最后,我只是订阅了边框的SizeChanged事件:
border.SizeChanged += OnSizeComputed;
当事件被触发时,我使用ActualWidth &ActualHeight .