文本块边距导致越界文本

时间:2016-08-11 14:02:48

标签: c# xaml uwp marquee

我目前正在尝试创建一个可视组件来滚动文本(从左到右和从右到左) - 几乎是一个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 文字&#34;离开&#34;网格槽是隐藏的。

但是,当我将文本块的边距设置为负值时,它可能会从左侧返回到可查看区域内,即使文本位于其分配的插槽之外,该文本也是可见的: https://s10.postimg.org/pownqtjq1/text_bad.png

我尝试过使用填充,但我无法设置负填充。我尝试过其他一些事情,但我觉得我遇到了障碍。

我能做些什么来获得精美的滚动文字?

2 个答案:

答案 0 :(得分:0)

如果你想要很好地滚动文本ListView可能是一个更好的选择。它是动态的,您可以将它绑定到您的对象。这需要很多猜测。

答案 1 :(得分:0)

Ed Plunkett带着Clip属性引领我走向正确的方向。我们的想法是这样做:

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

当然,如果尚未渲染边框,那么这不起作用(当然,当我的代码运行时不是这样)。您可以使用“测量”强制测量,就像我测量文本长度(以像素为单位)一样,但它在我的边框上表现得很奇怪。我根本不会得到正确的尺寸。

最后,我只是订阅了边框的SizeChanged事件:

border.SizeChanged += OnSizeComputed;

当触发该事件时,我使用ActualWidth&amp;创建RectangleGeometry。的ActualHeight。