1

我正在显示的 ListViewItems 分类在 ListView 中的 ListView Groups 中,只显示它们的 Text 属性,并在此被截断(即使它们是特定组中的唯一项目,并且有英亩和公顷的屏幕空间可用) .

我希望他们确实显示他们的 Text 属性,但要完整地显示,而不是截断。

我以这种方式分配 ListViewItem 文本属性:

public LegacyApplication(String AAppName, String ATitle, String ADesc, String AIconFileName, String APathOfExe) {
  . . .
  base.Text = ATitle;
  . . .
}

我做错了什么或做错了什么?是否有一些我不知道的属性会控制 ListViewItem 上文本的外观?

4

6 回答 6

2

Windows 资源管理器还为修剪的文本设置工具提示,它还使用 ListView 控件。您可以通过处理 MouseMove 事件并使用 ListView.GetItemAt(...) 来找出鼠标正在移动的项目来模仿它的行为。或者,您可以使用 ItemMouseHover 事件,但是我发现 MouseMove 对用户更友好,因为用户不必实际悬停并等待工具提示弹出...。

我使用以下逻辑来模仿 Windows 资源管理器的行为(此示例只是草稿,可能包含错误):

     //get the item at the current mouse location.
     ListViewItem item = myListView.GetItemAt(e.X, e.Y);
     if (item != null)
     {
        using (Graphics graphics = this.myListView.CreateGraphics())
        {
           var itemTextWidth = graphics.MeasureString(item.Text, item.Font).Width;
           if (itemTextWidth > myListView.Width)
           {
              if (!item.Equals(itemsToolTip.Tag) && !itemsToolTip.Active)
              {
                 //Set the tooltip , tag it with the item and set it as active ... 
              }
              // Adjacent ' text trimmed' list view items.  
              else if (!item.Equals(itemsToolTip.Tag))
              {
                 //set the tooltip as none active.
              }
           }
           else//None trimmed list view items.
           {
              //clear the tooltip and set it as none active
           }
        }
     }
     else
     {
        //clear the tooltip and set it as none active
     }
  }
于 2015-03-05T09:01:55.817 回答
2

不确定这是否适合您的情况,但也许您可以尝试使用AutoResizeColumn 方法;设置为ColumnContent.

于 2012-04-04T02:17:17.307 回答
2

我知道这是一个老问题,但我确信 Dr.Wilys 对 AutoResizeColumn 的回答应该是正确的,所以稍微探索了一下......

将输出写入列表视图(我的是批量 sql 服务器操作的输出)后,我更新了列表视图(此处为 lstResults):

lstResults.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.HeaderSize);
lstResults.AutoResizeColumn(1, ColumnHeaderAutoResizeStyle.ColumnContent);

这对我有用...注意我的视图类型是Details,我没有尝试过其他的。

于 2016-02-04T10:04:01.267 回答
1

如果您想要 ListView 中的多行文本,请查看ObjectListView(一个围绕 .NET WinForms ListView 的开源包装器)。这解决了与所有者绘图相关的许多问题(以及其他 ListView 烦恼)。

我会将此作为评论,但它是答案,并且有一个可爱的屏幕截图:WinForms ListView 控件上的多行列表项?

然后,如果您有任何疑虑,请查看后续内容: 如何使用 ObjectListView 在列中对文本进行 wordWrap

于 2012-04-04T02:04:46.767 回答
1

我发现最好的解决方案是使用 View = View.Tile。

这会显示大部分文本;我的解决方法是将文本分配给每个项目的工具提示,以便在仍未显示全文的情况下,用户可以悬停并进入视线。

于 2012-04-07T15:58:12.743 回答
1

@Ahmad 答案的充实版本(对不适合的项目使用工具提示):

    void SetTooltipForNonFittingItems(ListView listView)
    {
        var tooltip = new ToolTip();
        listView.MouseMove += (_1, e) =>
        {
            ListViewItem item = listView.GetItemAt(e.X, e.Y);
            if (item != null)
            {
                using (Graphics graphics = listView.CreateGraphics())
                {
                    var itemTextWidth = graphics.MeasureString(item.Text, item.Font).Width;
                    if (itemTextWidth > listView.Width)
                    {
                        if (!item.Equals(tooltip.Tag))
                        {
                            tooltip.Active = true;
                            tooltip.Tag = item;
                            // as written, the tooltip covers the item
                            // if you prefer to show it at the location of the cursor,
                            // use listView.PointToClient(Cursor.Position)
                            tooltip.Show(item.Text, listView, item.Position);
                        }
                    }
                    else
                    {
                        tooltip.Tag = null;
                        tooltip.Active = false;
                    }
                }
            }
            else
            {
                tooltip.Tag = null;
                tooltip.Active = false;
            }
        };
    }
于 2018-06-25T10:26:04.990 回答