1

这是场景:

我正在开发一个代码编辑器(Winforms),我使用一个RichTextBox和一个组件作为 Intellisense 。

按“。”时 中RichTextBox,Intellisense 将出现,其中的每个对象都有不同的 Tooltip。

像这样的东西:

现在工具提示位置是跟随SelectedIndex我想出了这个代码:

public void SetToolTip(Intellisense intellisenseitem)
        {
    if (selectedItemIndex == 0)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex, 3000);
                }
                if (selectedItemIndex == 1)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 15, 3000);
                }
                if (selectedItemIndex == 2)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 30, 3000);
                }
                if (selectedItemIndex == 3)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 45, 3000);
                }
                if (selectedItemIndex == 4)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 60, 3000);
                }
                if (selectedItemIndex == 5)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 75, 3000);
                }
                if (selectedItemIndex == 6)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 90, 3000);
                }
                if (selectedItemIndex == 7)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 105, 3000);
                }
                if (selectedItemIndex == 8)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 120, 3000);
                }
                if (selectedItemIndex == 9)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 135, 3000);
                }
                if (selectedItemIndex == 10)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 150, 3000);
                }
                if (selectedItemIndex == 11)
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 165, 3000);
                }
                if (selectedItemIndex >= 12) //still needed to fix
                {
                    toolTip.ToolTipTitle = title;
                    toolTip.Show(text, this, Width + 3, SelectedItemIndex + 165, 3000);
                }
}

问题是当 Intellisense 项目达到 12 以上时(请注意,Intellisense 有一个过滤器可以过滤像 Visual Studio 中的 Intellisense 一样startswith输入的文本()Richtextbox),它会自动滚动(因为它达到了最大尺寸)现在问题是 Tooltip 在使用滚动时现在不会跟随其 Selecteditemindex 。

控制智能感知就像一个列表框。(因为我之前提到它是我使用的一个组件)

现在我的问题是如何让工具提示始终遵循SelectedItemIndex智能感知。

4

1 回答 1

3

如果你用这个重构你的代码,它会让你更容易。

void SetToolTip(Intellisense intellisenseitem)
 {
    toolTip.ToolTipTitle = title;
    toolTip.Show(text, this, Width + 3, SelectedItemIndex + (15 * selectedItemIndex ), 3000);
 }

一旦滚动条开始移动,您应该使用滚动索引而不是 Selected Item 索引。从理论上讲,您根本不应该使用 Selected Item Index,而是应该使用 Selected Item 位置(我不确定列表框是否将 Selected Item Position 公开,您可能需要深入研究 Reflection 并获取私有字段所选项目的位置)。

编辑

你需要的是:

void SetToolTip(Intellisense intellisenseitem)
 {
    toolTip.ToolTipTitle = title;
    var x = Width + 3;
    // get the rectangle of the selected item, the X, Y position of the rectangle will be relative to parent list box.
    var rect = listBox1.GetItemRectangle(listBox1.SelectedIndex); 
    var y = listBox1.Location.Y + rect.Y; // Add ListBox Y and the Selected Item Y to get the absolute Y.

    toolTip.Show(text, this, x, y, 3000);
 }
于 2013-07-10T08:52:22.633 回答