文本块边距导致文本越界

本文关键字:文本 越界 | 更新日期: 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 .