我有一个TextBlock
,我通过DoubleAnimation()
在Canvas
内移动。在封闭窗口SizeChanged
事件中,我能够正确调整TextBlock.FontSize
和内部Canvas
的大小,但在Canvas
中正确获取TextBlock
的位置时遇到问题。(我试图做某种形式的Canvas.SetTop(NameQueueTextBlock, <newVal>)
,但没有成功。)
<Canvas Grid.Column="1" ClipToBounds="True">
<Canvas Name="NameQueueCanvas" ClipToBounds="True" Height="79" Width="309">
<TextBlock Canvas.Top="0" Name="NameQueueTextBlock" FontSize="19" Text=" "/>
</Canvas>
</Canvas>
我猜你的DoubleAnimation
是罪魁祸首。
如果在移动TextBlock
时保持Canvas.Top
的结束值(默认值),则根据WPF优先级系统,Canvas.Top
的任何未来更新都将"显示"为被忽略。
解决方案:
切换
Canvas.SetTop(NameQueueTextBlock, /*newVal*/);
带有
NameQueueTextBlock.BeginAnimation(Canvas.TopProperty, null);
Canvas.SetTop(NameQueueTextBlock, /*newVal*/);
你应该被分类。
替代方法:
假设您的Storyboard
被称为sb
,就在调用sb.Begin();
之前
添加以下内容:
sb.Completed += (o, args) => {
var finalVal = Canvas.GetTop(NameQueueTextBlock);
NameQueueTextBlock.BeginAnimation(Canvas.TopProperty, null);
Canvas.SetTop(NameQueueTextBlock, finalVal);
};
我更喜欢这样,因为这样可以让您不必跟踪哪个代码片段可能会首先更改TextBlock
上的Canvas.Top
,并在手边用null
动画重置该属性。