.net 是否有Linux mono';s拒绝承认我已调整VirtualMode ListView列的大小?
调整列的大小时,它不会使用更新的对齐方式重新绘制数据。我尝试过无效、刷新和其他一些事情。什么都没起作用。有人知道解决方法吗?我还没有在mono for Windows中尝试过这个 要了解我的意思,请将此控件放到窗体上,然后在mono for Linux中运行它:.net 是否有Linux mono';s拒绝承认我已调整VirtualMode ListView列的大小?,.net,linux,listview,mono,virtualmode,.net,Linux,Listview,Mono,Virtualmode,调整列的大小时,它不会使用更新的对齐方式重新绘制数据。我尝试过无效、刷新和其他一些事情。什么都没起作用。有人知道解决方法吗?我还没有在mono for Windows中尝试过这个 要了解我的意思,请将此控件放到窗体上,然后在mono for Linux中运行它: using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Drawing;
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
class MyListView : ListView
{
private readonly List<ListViewItem> items_ = new List<ListViewItem>();
public MyListView()
{
VirtualMode = true;
Columns.Add("Col 1");
Columns.Add("Col 2");
Columns.Add("Col 3");
Add(new ListViewItem(new[] { "a", "b", "c" }));
Add(new ListViewItem(new[] { "a", "b", "c" }));
Add(new ListViewItem(new[] { "a", "b", "c" }));
Add(new ListViewItem(new[] { "a", "b", "c" }));
Add(new ListViewItem(new[] { "a", "b", "c" }));
}
protected override void OnRetrieveVirtualItem(RetrieveVirtualItemEventArgs e)
{
e.Item = items_[e.ItemIndex];
base.OnRetrieveVirtualItem(e);
}
public void Add(ListViewItem item)
{
items_.Add(item);
VirtualListSize = items_.Count;
}
protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
e.DrawText();
base.OnDrawColumnHeader(e);
}
protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
var text = ((ListViewItem.ListViewSubItem)e.SubItem).Text;
using (var brush = new SolidBrush(e.SubItem.ForeColor))
{
e.Graphics.DrawString(text, Font, brush, e.Bounds);
}
base.OnDrawSubItem(e);
}
protected override void OnColumnWidthChanged(ColumnWidthChangedEventArgs e)
{
base.OnColumnWidthChanged(e);
Invalidate(true); // Nope, that didn't work
Refresh(); // Nope, that didn't work
}
}
使用系统;
使用System.Collections.Generic;
使用系统文本;
使用System.Windows.Forms;
使用系统图;
类MyListView:ListView
{
私有只读列表项\=new List();
公共MyListView()
{
VirtualMode=true;
列。添加(“第1列”);
列。添加(“第2列”);
列。添加(“第3列”);
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
添加(新的ListViewItem(新的[]{“a”、“b”、“c”}));
}
RetrieveVirtualItem上受保护的覆盖无效(RetrieveVirtualItemEventArgs e)
{
e、 项目=项目[e.ItemIndex];
基于检索虚拟项目(e);
}
公共作废添加(ListViewItem)
{
项目\添加(项目);
VirtualListSize=项目计数;
}
受保护的覆盖无效OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
{
e、 DrawText();
底端.柱头(e);
}
受保护的覆盖无效OnDrawSubItem(DrawListViewSubItemEventArgs e)
{
var text=((ListViewItem.ListViewSubItem)e.SubItem).text;
使用(var笔刷=新的SolidBrush(e.子项.前景色))
{
e、 绘图字符串(文本、字体、画笔、e.Bounds);
}
基数:分项(e);
}
ColumnWidthChanged(ColumnWidthChangedEventArgs e)上的受保护覆盖无效
{
基础。更改了列宽(e);
无效(正确);//不,那不起作用
刷新();//不,那不行
}
}
我想出来了。虽然我存储和重用ListViewItem实例的方法在Windows中运行良好,但mono更希望我在OnRetrieveVirtualItem的主体中重新创建它们。BTW,我知道代码有问题(就像构造函数中的所有内容一样)。这只是为了便于测试问题。