This is a baked layout for viewing tiles. If you need labels below the images, you need to set View = LargeIcon. If this creates an unwanted distance between images, you can P / Invoke SendMessage () send the LVM_SETICONSPACING message. This worked well:
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); }
Change the new IconSpacing property in the designer to work well with the size of images in your ImageList. You will immediately see the effect.
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
source share