【发布时间】:2014-03-26 22:08:09
【问题描述】:
在 GTK# 应用程序中,我在 ScrolledWindow 中使用 TreeView,并尝试在 TreeStore 中查找项目的位置,以从 Cairo 中的该项目开始绘制线条。目前,我使用的是单元格高度的硬编码值,它适用于少数项目,但是当使用其他字体大小或项目列表变长时,会有一个可见的偏移量。是否有获取 TreeView 的单元格高度的方法,或获取 TreeStore 中项目的垂直位置的其他方法?
这是我目前使用的方法:
int GetYPositionForPort (TreeView tree, TreeStore store, Port selectedPort)
{
// Is there a way to get the cell height?
int cellHeight = 24;
// We start in the middle of the first Treeview item
int position = cellHeight / 2;
ScrolledWindow treeParent = tree.Parent as ScrolledWindow;
if (treeParent != null) {
position -= Convert.ToInt32 (treeParent.Vadjustment.Value);
}
TreeIter clientIter;
TreeIter portIter;
if (store.GetIterFirst (out clientIter)) {
do {
if (store.IterHasChild (clientIter)
&& tree.GetRowExpanded (store.GetPath (clientIter))) {
if (store.IterChildren (out portIter, clientIter)) {
do {
position += cellHeight;
} while (((Port)store.GetValue(portIter, 0) != selectedPort
|| (Client)store.GetValue(clientIter, 0) != selectedPort.Client)
&& store.IterNext(ref portIter));
}
}
//Necessary because the first Treeview item only counts as 1/2 cell height.
if (((Client)store.GetValue (clientIter, 0)) == selectedPort.Client) {
break;
}
position += cellHeight;
} while (store.IterNext(ref clientIter));
}
return position;
}
您可以在屏幕截图底部看到错误,其中行与 TreeView 中的项目不对齐:
【问题讨论】: