【问题标题】:How to rearrange children of canvas on ArrangeOverride wpf如何在 ArrangeOverride wpf 上重新排列画布的子项
【发布时间】:2018-01-30 06:50:56
【问题描述】:

我有画布,其中子元素动态添加到画布中,假设图像放置在左侧 = 50,当画布宽度 (500) 和高度 (200) 时位于顶部 50。当窗口最大化时,画布宽度和高度发生变化(1000、400),这一次想要根据画布宽度和高度重新排列图像位置。根据研究发现,必须实施

面板的MeasureOverride和ArrangeOverride方法。

在这里,用户可以向画布添加任意数量的项目,想要相对于画布大小缩放子项。

上述方法中的逻辑如何实现?

【问题讨论】:

  • "必须实现 MeasureOverride 和 ArrangeOverride"。这对于派生的 Panel 是正确的,但对于 Canvas 则不然。只需重新计算并设置子元素的 Left 和 Top。或者使用其他更合适的布局面板,例如 Grid 或 DockPanel。
  • 我正在使用从 Canvas 派生的自定义画布。
  • 投反对票,请添加评论

标签: wpf canvas scale panel arrangeoverride


【解决方案1】:

您可以在 SizeChanged 事件的事件处理程序中实现您的逻辑(无论是什么):

private void Canvas_SizeChanged(object sender, SizeChangedEventArgs e)
{
    Canvas canvas = sender as Canvas;
    Size size = e.NewSize;
    foreach (UIElement child in canvas.Children)
    {
        //set the new postion of each element according to your logic
        Canvas.SetLeft(child, );
    }
}

<Canvas x:Name="canvas" Width="500" Height="200" Background="Yellow" SizeChanged="Canvas_SizeChanged">
    <Button Content="..." Canvas.Left="50" Canvas.Top="50" />
</Canvas>

没有理由创建自定义 Panel 并覆盖 MeasureOverrideArrangeOverride 方法。

【讨论】:

  • 如何根据新的画布大小计算新的 left 和 top ?所有控件都是动态添加的。
  • 我应该怎么知道?这是你的逻辑。
  • 这不是我的逻辑,基于问题,当画布尺寸增加时,如何根据新的画布宽度找到新的左边?一个控件放在左边50,当画布宽度为(500)时,当画布宽度增加想设置左边为新宽度(左边值应该增加)
  • “根据新宽度...”?你计算新左值的公式是什么?
  • 您没有正确地回答我的问题吗?如果将控件放置在画布的中心,则控件应该位于中心,即使我们在更大的窗口中查看
猜你喜欢
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2012-12-05
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多