【发布时间】:2016-05-08 13:51:23
【问题描述】:
我有一个用 C# 编写的 Windows 应用程序,我想根据人们的分数对他们进行排名,分为 3 个级别;第一级得分最高的,第二级第二高的,第三级的。
我已经实现了这个,如图所示,成功使用了3组的ListView;我的问题是:我可以将每个组中的项目对齐到中心吗?项目左对齐
【问题讨论】:
我有一个用 C# 编写的 Windows 应用程序,我想根据人们的分数对他们进行排名,分为 3 个级别;第一级得分最高的,第二级第二高的,第三级的。
我已经实现了这个,如图所示,成功使用了3组的ListView;我的问题是:我可以将每个组中的项目对齐到中心吗?项目左对齐
【问题讨论】:
不,如果没有owner-drawing 和ListView,这是不可能的。
原因是ShowGroups 属性。
如果它是假的,你可以为每个ListViewItem计算Position..
这里是如何修改ListViewItem的位置:
ListViewItem lvi = listView1.Items[3];
lvi.Position = new Point(lvi.Position.X + 50, lvi.Position.Y);
lvi.Text = "X testing X";
但是如果ListView 不幸的是ShowGroups = true,这将不会产生影响。计算偏移量也不是一项简单的任务。毕竟它会根据 Items both 在组和行中的数量而有所不同。
因此您必须拥有ListView,这将起作用,但在确定确切位置时会遇到同样的问题。
而居中两个项目会使整个布局看起来参差不齐且丑陋,imo。
也许最简单的解决方案是一种变通方法:只需在需要的地方添加一个虚拟项目。它的图像是透明的,或者它的ImageIndex = -1; 和它的文本是空的或空白的。您可以将其插入到每个组中,其中的奇数个项目不能被一行中的最大项目数整除。在您的情况下 3. 或者检查该组是否仅包含一项就足够了..
这是一个例子:
void InsertBlankItem(ListView lv, ListViewGroup lvg)
{
ListViewItem lvOld = g.Items[0];
lvg.Items.Remove(lvOld);
ListViewItem lviBlank = new ListViewItem() { Text = " ", ImageIndex = -1 };
lviBlank.Group = lvg;
listView1.Items.Add(lviBlank);
lvg.Items.Insert(1, lvOld);
}
这会添加一个空白项并将第一项移动到末尾..:
private void button1_Click(object sender, EventArgs e)
{
foreach (ListViewGroup g in listView1.Groups)
{
if (g.Items.Count == 1) InsertBlankItem(listView1, g);
}
}
当然,现在您的 ListView.. 中有一个可点击的虚拟项目。
如果您想在一个组中重新订购更多 Items,您需要将它们全部删除到一个列表中,然后以新顺序重新添加它们。
【讨论】: