【问题标题】:(ListView?)-Control like in Windows Explorer(ListView?)- 像 Windows 资源管理器中一样控制
【发布时间】:2014-06-15 09:46:02
【问题描述】:

我想知道是否有任何方法可以在您插入设备时在 Windows 资源管理器的自动启动中制作类似的控件。

我原以为这可能是一个或多或少修改的列表视图控件,但我无法通过 Google 找到任何东西。我还检查了许多 CodeProject 页面。

有没有人知道我可以在哪里获得控制权或如何自己制作一个? (我不太擅长 OwnerDraw :P)

谢谢。

【问题讨论】:

  • Winforms 还是 WPF?在 WPF 中创建它很容易,而在 Winforms 中则不那么难。
  • 正常的WinForms。
  • 你能告诉我怎么做吗,@MD.Unicorn?
  • 很确定这一个ListView。您是否已经尝试过使用一个? OwnerDraw 应该是不必要的。不过,您需要应用 Explorer 主题:.NET ListView and Windows 7
  • 太棒了!是的,我试过了。我将看看它并尝试制作我自己的从 ListView 继承的用户控件。然后应用它应该可以工作。

标签: c# listview


【解决方案1】:

实际上调整ListView 并不比ownerDrawing 它容易。这是一个示例,它显示了它实际上是多么简单。

您只需编写一个事件 (DrawItem) 即可完成。

这段代码假设:

  • LV 的视图设置为列表
  • 您已将合适的 ImageList 添加到表单中
  • 您已将 LV 的 ownerDraw 设置为 true
  • 您已添加两列来保存两个标签中显示的文本
  • 您已使第一列的宽度足以容纳绘制的所有内容
  • 您已将 LV 的 FontSize 设置为与图像的高度一样大(例如 32)
  • 将适当的 ImageIndex 值分配给 LV 的项目

private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
  Point point0 = new Point(e.Bounds.Left, e.Bounds.Top);
  Point point1 = new Point(imageList1.ImageSize.Width + 10, e.Bounds.Top + 5);
  Point point2 = new Point(imageList1.ImageSize.Width + 10, e.Bounds.Top + 25);
  Size size = new Size(listView1.ClientRectangle.Width, e.Bounds.Height);
  Rectangle R = new Rectangle(point0, size);
  Font F1 = new Font(listView1.Font.FontFamily, 11f, FontStyle.Bold);
  Font F2 = new Font(listView1.Font.FontFamily, 10f);

  if (e.Item.Focused) e.Graphics.FillRectangle(Brushes.LightBlue, R);
    else if (e.ItemIndex % 2 == 1) e.Graphics.FillRectangle(Brushes.GhostWhite, R);
  e.Graphics.DrawImage(imageList1.Images[e.Item.ImageIndex], point0 );
  e.Graphics.DrawString(e.Item.Text, F1, Brushes.Black, point1);
  e.Graphics.DrawString(e.Item.SubItems[1].Text, F2, Brushes.Black, point2);
  F1.Dispose(); F2.Dispose();
}

请注意,我已经硬编码了一些颜色来绘制每隔一行以及重点项目。这些颜色确实应该使用各自的系统颜色。想到这些:

 SolidBrush brush0 = new SolidBrush(SystemColors.ControlLight);
 SolidBrush brush1 = new SolidBrush(SystemColors.Highlight);

我正在使用分配给 LV 但大小适中的字体。显然,或多或少的任何东西,尤其是各种偏移量,都可以根据自己的喜好进行配置。但是使用System.Colors 集合中的颜色是与用户的Windows 主题保持一致的好方法。

【讨论】:

  • 谢谢,请问您能把代码放在代码标签中吗?
  • 好吧,谢谢 :)。我用了你的代码。我不明白你对这些列的意思,或者更好地说明我与它们有什么关系。
  • 一个 ListView 可以有一个列集合。 (又名子项)。我认为,仅在详细视图中可见,但拥有它们对于保存第二个标签的文本和设置第一列的宽度很有用。
  • 好吧,我添加了两列。问题是该项目仍然具有正常的大小/高度,但它需要更大。
  • 你需要让LV的Font足够大;在设计器中执行或在 Form_load 事件中尝试listView1.Font = new Font("Arial", 32f);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2010-12-30
  • 2010-11-29
  • 2016-09-08
  • 2012-02-23
  • 1970-01-01
相关资源
最近更新 更多