2014-03-26 46 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