首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找给定大小的最佳布局(网格)

查找给定大小的最佳布局(网格)
EN

Stack Overflow用户
提问于 2016-04-16 07:06:06
回答 1查看 131关注 0票数 0

我有一个WPF自定义面板,我想在其中布局几个元素(在我的例子中是12,但理想情况下,我希望找到一个对所有人都有效的算法),所有这些元素都具有相同的最小宽度/高度。布局是一个Grid,但是我可以选择我想要的列/行数。

我希望找到一种方法来决定我创建了多少列和多少行,这取决于窗口的比率。

如果子元素有1/1的比率,就更容易了;我只需计算可能布局的比率(承认我有12个子元素: 12/1、6/2、4/3、3/4、2/6、1/ 12 ),并检查哪个子元素更接近面板宽度/高度比。

但在我的实际情况下,我可以设置我的子项的两倍宽,所以我有点不知道如何计算这个?我想我需要拿他们的“理想尺寸”,然后做一些数学之间,但我不知道如何。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-16 09:46:52

经过一些实验和单元测试,我想我找到了一个解决方案。事实上,我不需要宽度/高度,只需要它们的比率,元素也是一样的。

我有以下类表示布局:

代码语言:javascript
运行
复制
public class Layout : IEquatable<Layout>
{
    public int RowCount { get; }
    public int ColumnCount { get;  }
    public double Ratio { get; }

    public Layout(int rowCount, int columnCount)
    {
        RowCount = rowCount;
        ColumnCount = columnCount;
        Ratio = (float)rowCount/columnCount;
    }
}

为了得到最好的布局,我做了以下工作:

代码语言:javascript
运行
复制
public class LayoutAdapter
{
    public Layout ComputeBestGridLayout(int elementsCount, double elementRatio, double panelRatio)
    {
        IEnumerable<Layout> possibleLayouts = GetPossibleLayouts(elementsCount);
        return FindBestLayouts(possibleLayouts, elementRatio, panelRatio);
    }

    private IEnumerable<Layout> GetPossibleLayouts(int elementCounts)
    {
        //TODO Increment "elementsCounts", because maybe with some hole we will have a better match for the ratio
        List<Layout> acceptedResults =new List<Layout>();
        for (int i1 = 0; i1 <= elementCounts; i1++)
        {
            double rest2 = elementCounts%((double) i1);
            if (rest2 == 0)
            {
                int i2 = elementCounts/i1;
                acceptedResults.Add(new Layout(i1,i2));
            }
        }
        return acceptedResults;
    }


    private Layout FindBestLayouts(IEnumerable<Layout> possibleLayouts, double elementRatio, double panelRatio)
    {
        Layout closestLayout = null;
        double minDiff=Double.MaxValue;


        foreach (Layout possibleLayout in possibleLayouts)
        {
            double currentDiff = Math.Abs((panelRatio/ elementRatio) - possibleLayout.Ratio);
            if (currentDiff < minDiff)
            {
                minDiff = currentDiff;
                closestLayout = possibleLayout;
            }
        }
        return closestLayout;
    }

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

https://stackoverflow.com/questions/36661227

复制
相关文章

相似问题

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