【问题标题】:listview tile layout problem (vb.net)listview 平铺布局问题 (vb.net)
【发布时间】:2010-05-02 15:51:47
【问题描述】:

我有一个列表视图,它(最终)显示 iTunes 播放列表的专辑封面,其下有专辑名称。我遇到的问题是我无法在专辑名称上方获得专辑封面(目前是一个空白方块)。它总是在一边……我该怎么做?我试过添加列标题和同样...

设置列表视图的代码

    Dim myImageList As ImageList

    albumList.View = View.Tile
    albumList.TileSize = New Size(120, 150)

    ' Initialize the item icons. 
    myImageList = New ImageList()

    myImageList.Images.Add(Image.FromFile("c:/test.jpg"))
    myImageList.ImageSize = New Size(80, 80)
    albumList.LargeImageList = myImageList

然后我会循环显示每个使用的专辑名称

        Dim item0 As New ListViewItem(New String() _
                {Albums(i).Name}, 0)

        albumList.Items.Add(item0)

输出是http://i111.photobucket.com/albums/n122/mfacer/Screenshot2010-05-02at164815.png

但正如我所说,我想要橙色框下的专辑名称....

有什么想法吗? 感谢您提供任何信息!

【问题讨论】:

    标签: vb.net listview


    【解决方案1】:

    这是平铺视图的内置排列。如果您想要图像下方的标签,那么您必须设置 View = LargeIcon。如果这会产生不希望的图像间距,那么您可以 P/Invoke SendMessage() 以发送 LVM_SETICONSPACING 消息。这很好用:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    class TileView : ListView {
      public TileView() {
        mSpacing = new Size(48, 48);
      }
      private Size mSpacing;
      public Size IconSpacing {
        get { return mSpacing; }
        set {
          mSpacing = value;
          updateSpacing();
        }
      }
      protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
        updateSpacing();
      }
      private void updateSpacing() {
        if (this.IsHandleCreated) {
          SendMessage(this.Handle, 0x1000 + 53, IntPtr.Zero, (IntPtr)((mSpacing.Height << 16) | mSpacing.Width));
        }
      }
      [DllImport("user32.dll")]
      private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
    }
    

    在设计器中更改新的 IconSpacing 属性,使其与 ImageList 中的图像大小配合得很好。您会立即看到效果。


    Public Class TileView
      Inherits ListView
    
      Public Sub New()
        mSpacing = New Size(48, 48)
      End Sub
    
      Private mSpacing As Size
    
      Public Property IconSpacing As Size
        Get
          Return mSpacing
        End Get
        Set(ByVal value As Size)
          mSpacing = value
          updateSpacing()
        End Set
      End Property
    
      Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
        MyBase.OnHandleCreated(e)
        updateSpacing()
      End Sub
    
      Private Sub updateSpacing()
        If Me.IsHandleCreated Then
          SendMessageW(Me.Handle, &H1000 + 53, IntPtr.Zero, CType((mSpacing.Height << 16) Or mSpacing.Width, IntPtr))
        End If
      End Sub
    
      Private Declare Function SendMessageW Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wp As IntPtr, ByVal lp As IntPtr) As IntPtr
    End Class
    

    【讨论】:

    • 感谢您的回复。我在哪里添加此代码?我尝试在我的项目中添加一个新的类文件,但这似乎不对......这是一个新项目,到目前为止我只使用了默认值......所以我只有 form1.vb(设计和代码),... 再次感谢,非常感谢 :)
    • 是的,向您的项目添加一个新类。编译后,您将在工具箱顶部获得新控件。哎呀,没有看到 VB.NET 的要求。
    • hmm...我添加了类,但它不喜欢代码!这只是普通的VB吗? (注意您的 VB.net 评论!)
    • @Matt:听起来这是一个答案。你还需要什么吗?
    • 我似乎无法在橙色方块下添加另一行...您发布的代码是否只显示一个?我尝试添加 tileView.Columns.AddRange(New ColumnHeader() {New ColumnHeader, New ColumnHeader}) 但它只显示一行??
    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多