C# 文本块边距导致超出边界的文本

C# 文本块边距导致超出边界的文本,c#,xaml,uwp,marquee,C#,Xaml,Uwp,Marquee,我目前正在尝试创建一个可视化组件,使其具有滚动文本(从左到右和从右到左)-几乎是一个html字幕 我有一个分为几列和几行的网格,我想把我的组件放在其中一个网格插槽中 网格(命名为UIGrid)的生成方式如下: for (int i = 0; i < xDivisions; i++) { ColumnDefinition newColumn = new ColumnDefinition(); UIGrid.ColumnDefinitions.Add(newColumn); }

我目前正在尝试创建一个可视化组件,使其具有滚动文本(从左到右和从右到左)-几乎是一个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++;
}
textBlock.Measure(新大小(double.PositiveInfinity,double.PositiveInfinity));
double textWidth=textBlock.DesiredSize.Width;
双可视宽度=componentBase.ActualWidth;
double targetMargin=文本宽度<可视宽度?visibleWidth:textWidth;
如果(margin.Left==targetMargin)
{
左边距=-textWidth;
}否则
{
margin.Left++;
}
当文本从左向右滑动时,其表现良好: “离开”网格槽的文本被隐藏

但是,当我将textblock的边距设置为负数,以便它可以从左侧回到可视区域内时,即使文本在其分配的插槽之外,它仍然可见:

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


我该怎么做才能得到一个漂亮的滚动文本呢?

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

Ed Plunkett用Clip属性将我引向了正确的方向。这样做的想法是:

border.Clip = new RectangleGeometry
{
    Rect = new Rect(0, 0, border.ActualWidth, border.ActualHeight)
};
当然,如果边框还没有被渲染(当然在我的代码运行时也没有),这就不起作用了。您可以使用“Measure”强制进行测量,就像我测量文本长度(以像素为单位)时所做的那样,但它在我的边框上表现得很奇怪。我根本拿不到正确的尺码

最后,我只是订阅了border的SizeChanged活动:

border.SizeChanged += OnSizeComputed;

触发该事件后,我将使用ActualWidth和ActualHeight创建矩形几何体。

如果您发布网格xaml,以便我们可以看到到底发生了什么,那就太好了。现在,请尝试将网格内的Textblock水平对齐设置为Stretch@AVKNaidu更改文本块或边框的水平对齐方式并没有改变滚动行为=(我很想知道为什么你们这些人如此偏执地共享代码或清楚地说出自己的实际问题。无论如何,找到最外层的控件(我认为它可能是一个网格)并在其上设置
ClipToBounds=“True”
。这可能至少解决了您的部分问题,但很难确定,因为您是如此秘密。@EdPlunkett哦,这不是真正的秘密,我只是不想转储所有代码并说“这里,请调试这个”.我承认我可以在这里展示更多的代码,给我减分。至于'ClipToBounds',似乎在UWP中没有这样的属性,只有一个'Clip'属性,它是一个矩形,我必须自己设置。我仍在与它斗争。