首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在WPF窗体中从画布获取UI元素大小

在WPF窗体中从画布获取UI元素大小
EN

Stack Overflow用户
提问于 2018-06-23 04:13:02
回答 1查看 202关注 0票数 4

我将新的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} 

为什么我可以得到项目在画布上的位置,但不能得到项目的大小?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-23 05:11:34

我只是想猜猜你没有覆盖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);
}

编辑

我意识到我在评论中解释了这个问题,但没有将它添加到我的答案中。can't get the size的原因是你必须在你的派生类中提供一个重写来计算它。默认情况下,Canvas返回的DesiredSize为0,因为它将适应分配给它的任何大小。在您的派生控件的情况下,您有一个Canvas作为基类,但您已经向它添加了其他控件。如果不提供MeasureOverride方法的覆盖,则只调用基本方法(由Canvas实现的方法)。基本Canvas对控件的大小要求一无所知。您可能还需要覆盖ArrangeOverrideThis article很好地解释了这两种方法,它们做了什么,以及为什么您需要覆盖它们。并给出了两种方法的应用实例。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50994992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档