C# 从WPF表单中的画布获取UI元素大小

C# 从WPF表单中的画布获取UI元素大小,c#,wpf,C#,Wpf,我将新Ui元素实例化到画布上,如下所示: public class MainForm :Canvas { List<BannerImage> bannerList; AddImages() { bannerImage = new BannerImage("title", "content"); //accompanied with animation Children.Add(bannerImage);

我将新Ui元素实例化到画布上,如下所示:

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

    AddImages()
    {
        bannerImage = new BannerImage("title", "content");
        //accompanied with animation
        Children.Add(bannerImage);
        bannerList.Add(bannerImage);
    }
但我不能做到以下几点:

bannerItem.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity) 
Size s = bannerItem.DesiredSize;
结果总是这样

{0,0} 

为什么我可以得到物品在画布上的位置而不能得到大小

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

编辑

我意识到我在一篇评论中解释了这个问题,但没有将其添加到我的回答中。
无法获取大小的原因是,必须在派生类中提供一个重写来计算它。默认情况下,Canvas返回0的
DesiredSize
,因为它将适应分配给它的任何大小。对于派生控件,有一个
Canvas
作为基类,但添加了其他控件。如果不提供方法的重写,则只调用基本方法(由
Canvas
实现的方法)。基本
Canvas
对控件的大小要求一无所知。您可能还需要重写。对这两种方法、它们的作用以及您需要重写它们的原因进行了很好的解释。它还提供了这两种方法的示例。

BannerImage
类由什么组成?@dhilmathy它只是一个内部带有文本块和标签的画布。没有
.NET
类,称为
BannerImage
,这意味着它是一个由您定义的类。因此,除非我们知道像
DesiredSize
Measure()
这样的方法/属性做什么,否则不可能回答您的问题。@Sach BannerImage是一个画布,这就是为什么我可以调用您在控件中实现的那些方法ID?我相信默认情况下,
Canvas
将返回0作为它所需的大小,因为它将大小调整为告诉它的任何大小。由于派生的
画布中有子控件,因此需要确定所需的大小并返回它。好的,谢谢,我将对此进行研究。我所有的元素都是画布。所以我一直在做Canvas.Add(元素)。我来试试这个谢谢你的解释。我必须配置它,但我认为这是正确的方向。
{0,0} 
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);
}