2014-03-26 44 views
1

在GTK#应用程序中,我在ScrolledWindow中使用了一个TreeView,并尝试在TreeStore中查找项目的位置,以便从该项目开始画线。目前,我正在使用硬编码的单元格高度值,它可以用于少数项目,但是当使用其他字体大小或项目列表变长时,会出现可见的偏移量。有没有一种方法来获取TreeView的单元格高度,或者另一种方法来获取TreeStore中项目的垂直位置?在Treeview中获取项目或单元格高度的像素位置

这里是方法,是我目前使用的:

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的项目排列的截图底部的错误:

Screenshot of the application

回答

0

阅读该文档,我想出了以下丑陋的一段代码:

int GetCellHeight (TreeView tree) 
{ 
    if (_cellHeight > 0) { 
     return _cellHeight; 
    } 
    int offsetX; 
    int offsetY; 
    int cellWidth; 
    Gdk.Rectangle rectangle = new Gdk.Rectangle(); 
    TreeViewColumn column = tree.GetColumn (0); 

    // Getting dimensions from TreeViewColumn 
    column.CellGetSize(rectangle, out offsetX, out offsetY, 
     out cellWidth, out _cellHeight); 

    // And now get padding from CellRenderer 
    CellRenderer renderer = column.CellRenderers[0]; 
    _cellHeight += (int)renderer.Ypad; 
    return _cellHeight; 
} 

这就是它现在的样子: Current state of program