gpt4 book ai didi

c# - 从 WPF 窗体中的 Canvas 获取 UI 元素大小

转载 作者:行者123 更新时间:2023-11-30 12:20:34 26 4
gpt4 key购买 nike

我像这样在 Canvas 上实例化新的 Ui 元素:

public class MainForm :Canvas 
{
List<BannerImage> bannerList;

AddImages()
{
bannerImage = new BannerImage("title", "content");
//accompanied with animation
Children.Add(bannerImage);
bannerList.Add(bannerImage);
}

我需要调用 bannerImages 来获取它们的当前位置,以下工作:

foreach(bannerItem in bannerList)
{
double rightPosition = Canvas.GetRight(bannerItem);
}

但我不能执行以下操作:

bannerItem.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity) 
Size s = bannerItem.DesiredSize;

结果总是

{0,0} 

为什么我能得到item在canvas上的位置却不能得到size?

最佳答案

我只是猜测您没有覆盖 MeasureOverride。假设每个元素都是堆叠的,我将提供一个基本实现,但是您需要修改它以考虑您的子控件以及您可能创建的自定义布局(我不知道它们是否在网格中,水平堆叠,在某种滚动容器等中)。

protected override Size MeasureOverride(Size availableSize)
{
var height = 0.0;
var width = 0.0;

foreach (UIElement child in InternalChildren)
{
child.Measure(availableSize);
if (child.DesiredSize.Width > width) width = child.DesiredSize.Width;
height += child.DesiredSize.Height;
}

width = double.IsPositiveInfinity(availableSize.Width) ? width : Math.Min(width, availableSize.Width);
height = double.IsPositiveInfinity(availableSize.Height) ? height : Math.Min(height, availableSize.Height);

return new Size(width, height);
}

编辑
我意识到我在评论中解释了这个问题,但没有将其添加到我的答案中。您无法获取大小 的原因是您必须在派生类中提供覆盖来计算它。默认情况下,Canvas 返回 0 的 DesiredSize,因为它将适应分配给它的任何大小。对于派生控件,您有一个 Canvas 作为基类,但您已经向它添加了额外的控件。如果您不提供对 MeasureOverride 的覆盖方法,则基础方法(由 Canvas 实现的方法)是唯一被调用的方法。基本 Canvas 对您的控件大小要求一无所知。您可能还需要覆盖 ArrangeOverride . This article对这两种方法、它们的作用以及为什么需要覆盖它们提供了很好的解释。它还提供了这两种方法的示例。

关于c# - 从 WPF 窗体中的 Canvas 获取 UI 元素大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50994992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com