我有一个WPF自定义面板,我想在其中布局几个元素(在我的例子中是12,但理想情况下,我希望找到一个对所有人都有效的算法),所有这些元素都具有相同的最小宽度/高度。布局是一个Grid,但是我可以选择我想要的列/行数。
我希望找到一种方法来决定我创建了多少列和多少行,这取决于窗口的比率。
如果子元素有1/1的比率,就更容易了;我只需计算可能布局的比率(承认我有12个子元素: 12/1、6/2、4/3、3/4、2/6、1/ 12 ),并检查哪个子元素更接近面板宽度/高度比。
但在我的实际情况下,我可以设置我的子项的两倍宽,所以我有点不知道如何计算这个?我想我需要拿他们的“理想尺寸”,然后做一些数学之间,但我不知道如何。
谢谢!
发布于 2016-04-16 09:46:52
经过一些实验和单元测试,我想我找到了一个解决方案。事实上,我不需要宽度/高度,只需要它们的比率,元素也是一样的。
我有以下类表示布局:
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;
}
}https://stackoverflow.com/questions/36661227
复制相似问题