窗口大小调整后如何在Canvas中定位TextBlock?

时间:2013-06-20 14:37:21

标签: wpf animation resize dependency-properties window-resize

我有TextBlock我通过CanvasDoubleAnimation()内移动。在封闭的窗口SizeChanged事件中,我可以正确调整TextBlock.FontSize和内部Canvas的大小,但是我在TextBlock内正确定位Canvas时遇到问题{1}}。 (我试图做某种形式的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="&#10;"/>
    </Canvas>
</Canvas>

1 个答案:

答案 0 :(得分:1)

我猜你的DoubleAnimation是罪魁祸首。

如果保持Canvas.Top的结束值(默认值),同时移动TextBlock根据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);
};

我更喜欢这个,因为它可以让您无法跟踪哪个代码片段可能会首先更改Canvas.Top上的TextBlock并使用null重置该属性事前动画。