【问题标题】:Silverlight scrolling text & max width issueSilverlight 滚动文本和最大宽度问题
【发布时间】:2010-08-28 00:32:53
【问题描述】:

我正在尝试在运行良好的屏幕上滚动文本。

更新:我仍然遇到问题,现在可以在我的实时应用上演示它:

  1. 转到 http://www.pokerdiy.com/poker-blinds-timer.aspx 并将其保留为非全屏。
  2. 单击顶部的“计时器”选项卡。 然后点击“开始锦标赛”。在 顶部,滚动消息将 从右边出现。在我的显示器上 (22 英寸) - 这在它之前切断 已经说完。
  3. 然后右键单击以将大小调整为完整 屏幕,然后重新开始比赛和 然后再次启动它以显示相同 信息。你现在会看到它 有效!

这是一个大问题,因为我想在顶部滚动 LONG 消息...请问有什么想法吗?

问题总结:

我在屏幕右侧有一个文本块,它没有设置宽度并且绑定到一个字符串值。我以编程方式启动一个动画,该动画更改 CompositeTransform.TranslateX 上的 From 和 To 值,以在屏幕上移动整个文本块以呈现滚动的外观。此文本块的宽度自动调整为绑定的字符串值,我将其设置为 Animation To 值(负),因此它将其从屏幕左侧移开(参见下面的代码)。

所以这一切都非常有效......但不是长消息。截断我的文本的内容似乎有宽度限制。在某些时候,它会以宽度限制将其切断(最后一个字符呈现为一半,因此它不是字符限制)。我设置了一个循环来创建一个大字符串并输出 Textblock 的 ActualWidth,它显示为 17000(这是正确的)。 Width 也很好,实际的 Text 属性显示了完整的字符串...但是 UI 在某个点截断了它,我无法弄清楚。

所以 - 1) 这种方法是否可行(有更简单的方法吗?)以及 2) 导致截断的原因是什么?

谢谢!

Xaml:-

<Storyboard x:Name="StoryboardScrollText" Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)">
<DoubleAnimation x:Name="StoryboardScrollTextAnimation" Storyboard.TargetName="txtSystemMessage" From="500" To="-740" Duration="0:0:30" />
</Storyboard>


<TextBlock x:Name="txtSystemMessage" TextWrapping="NoWrap" Text="{Binding TourneyMessage}" Foreground="White" FontSize="20" VerticalAlignment="Center" >
<TextBlock.RenderTransform>
<CompositeTransform TranslateX="0"/>
</TextBlock.RenderTransform>
</TextBlock>

代码:-

mainPage.StoryboardShowTourneyMessage.Begin();

//has to scroll the whole message off the screen (plus a bit extra as it starts off the screen)
//get the leftmost position of the logo so it starts just behind it  
mainPage.StoryboardScrollTextAnimation.From = GetPositionX(mainPage.NavigationGridLogo);
mainPage.StoryboardScrollTextAnimation.To = mainPage.txtSystemMessage.ActualWidth * -1 - 50;
mainPage.StoryboardScrollText.Begin();

MessageBox.Show(mainPage.txtSystemMessage.ActualWidth.ToString() + " " + mainPage.txtSystemMessage.Width.ToString());

【问题讨论】:

    标签: silverlight silverlight-4.0


    【解决方案1】:

    第 1 部分: 如果您打算基于像素 动画,使用画布作为 父对象。网格可以工作,但在第 2 部分(下)中查看问题的原因

    第 2 部分: 基本上是截断你的 文本是由父母引起的 容器裁剪孩子。这个 正在发生基于宽度 父级,它忽略 你的文字。

    解决方案:

    • 如果将 TextBlock 放置为子级 画布,而不是网格(甚至只是网格内画布内的 TextBlock),它将呈现 默认情况下,作为画布的完整长度永远不会剪辑其子级。

    • 您可能需要添加一个剪辑矩形 到画布隐藏任何部分 延伸到你做的地方的文字 不想看到它,但这将取决于屏幕上隐藏重叠的其他组件。 如果您确实添加了一个剪辑矩形,请确保使用 Canvas.Left 而不是 TranslateX 为文本位置设置动画,否则您可能会再次遇到原始问题!

    【讨论】:

    • 感谢您的建议 HiTech - 请您详细说明一下 - 我将父容器(包含移动的 textblox 的立即网格)更改为 Canvas,但剪辑仍然发生(你是对的 - 它是父母的宽度,我没有注意到)。那么你说“添加一个剪辑矩形” - 我不知道这是什么?另外,您能解释一下为什么使用 TranslateX 不起作用但使用 Grid.Left 会起作用吗?可以为此使用 Grid.Left 吗?谢谢!
    • Grid.Left 是一个错字。我的意思是 Canvas.Left(现已更正)。您能否提供更多您的 Xaml(足以实际构建),以便我可以为您提供一个具体的工作示例?如果您不想公开,请通过我们的网站与我们联系(请参阅我们的 ID 详细信息)。
    • 好的,在这种情况下 - 在 TranslateX 上使用动画而不是 Canvas Left 有什么好处吗?我只是想知道是否可能有区别。 ps - 我查看了你的网站并想发表评论(在你的 SO 帖子上) - 但你不允许匿名 cmets - 只是想添加我的 2c ;) 我现在会把我主页的 xaml 发送给你..非常感谢!
    • @Rodney:翻译改变了项目的渲染原点,但就父项而言,对象本身保持在 0,0。 Canvas.Left 实际上改变了渲染原点。画布的子级应使用 Left 和 Top 属性,但基本上您添加到画布的任何剪辑都可能会受到此选择的影响。我会寻找你的电子邮件。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    相关资源
    最近更新 更多