2010-05-02 6 views
4

У меня есть список, который отображает (в конце концов) обложку альбома списка воспроизведения itunes с названием альбома под ним. проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить обложку альбома (в настоящее время пустой квадрат). ВЫШЕ название альбома. Это всегда на стороне ... как мне это сделать? Я попытался добавить заголовки столбцов и alsorts ...проблема с раскладкой плитки listview (vb.net)

код, чтобы настроить ListView

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

но, как я сказал, я хочу, название альбома под оранжевым ....

любые идеи ?? Спасибо за любую информацию!

ответ

7

Это выпечка в виде плитки. Если вы хотите, чтобы метки находились под изображениями, то у вас есть, чтобы установить 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 
+0

спасибо за ответ. Где я могу добавить этот код? Я попытался добавить новый файл класса в свой проект, но это не кажется правильным ... это новый проект, и до сих пор я использовал только значения по умолчанию ... поэтому у меня есть только form1.vb (дизайн и код), ... еще раз спасибо, это очень ценно :) –

+0

Да, добавьте новый класс в свой проект. После компиляции вы получите новый элемент управления в верхней части панели инструментов. Shucks, не видел требования VB.NET. –

+0

hmm ... Я добавил класс, но код ему не нравится! Это просто нормальный VB? (замечая ваш комментарий VB.net!) –

Смежные вопросы