【问题标题】:Get Pixel Position of Item or Cell Height in Treeview在 Treeview 中获取项目的像素位置或单元格高度
【发布时间】: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 中的项目不对齐:

【问题讨论】:

    标签: gtk# gtk2


    【解决方案1】:

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

    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;
    }
    

    这就是现在的样子:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 2011-10-19
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多