如何在调整窗口大小后在画布中定位TextBlock



我有一个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="&#10;"/>
    </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动画重置该属性。

相关内容

  • 没有找到相关文章

最新更新