【问题标题】:Find the best layout(grid) for a given size找到给定尺寸的最佳布局(网格)
【发布时间】:2016-08-08 06:11:06
【问题描述】:

我有一个 WPF 自定义面板,我想在其中布局多个元素(在我的例子中是 12,但理想情况下我想找到一种适用于所有人的算法),所有元素都具有相同的最小宽度/高度。布局是一个网格,但我可以选择我想要的列数/行数。

我想找到一种方法来决定我创建多少列和多少行,具体取决于窗口的比例。

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

但在我的实际情况下,我可以将子项设置为宽度的两倍,所以我对如何计算这个有点迷茫?我想我需要取它们的“理想尺寸”,然后在它们之间做一些数学运算,但我不知道该怎么做。

谢谢!

【问题讨论】:

    标签: c# wpf algorithm layout


    【解决方案1】:

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

    我有以下代表布局的类:

    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;
        }
    }
    

    为了获得最佳布局,我做了以下操作:

    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;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2013-12-23
      相关资源
      最近更新 更多