0

WPFのCoverFlow効果に関して他にも質問があることを知っています。私のお気に入りは、WPF用の優れたiTunes CoverFlowタイプのコントロールはありますか?

「パート7」をダウンロードしました。これはWPFとC#に含まれています。

現在、特にGUIライブラリ用にサードパーティのライブラリを使用することはほとんどなく、プロジェクトでそのテンプレートを使用する方法がわかりません。

それで、基本的に、どうすればそれをプロジェクトに正しく含めることができますか?Referencesでライブラリを取得した後はどうすればよいですか?

より良いCoverFlowテンプレート(そして無料)を知っているなら、どれを教えてもらえますか?

助けてください(ちょっとしたヒント、私のプロジェクトはVB.NETにありますが、.dllでは何の問題もないと思います)

4

1 に答える 1

1

使用しているコンポーネントの例CoverFlowは、スタンドアロン コントロールとして完全には機能しません。ThumbnailManager実装する必要があるというインターフェースがあります。最初にツールボックスを右クリックして [アイテムの選択] を選択し、Coverflowコンポーネントを含む .dll ファイルに移動して選択することで、VB で動作させることができました。その後、ツールボックスから MainWindowDed.Tutorial.Wpf.CoverFlow.Part7.FlowComponent.dllにドロップすることができました。FlowControl. 次に、作成者が作成に使用した C# コードThumbnailManagerを VB に変換しました。

ThumbnailManager.vb

Imports System.IO.IsolatedStorage
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging
Imports Ded.Tutorial.Wpf.CoverFlow.Part7.FlowComponent
Imports Ded.Tutorial.Wpf.CoverFlow.Part7.FlowComponent.FlowControl

Namespace Ded.Tutorial.Wpf.CoverFlow.Part7.FlowComponent
    Public Class ThumbnailManager : Implements IThumbnailManager
        Private ReadOnly store As IsolatedStorageFile

        Private Shared Function AmazonCut(myImage As Image) As Image
            If (myImage.Width <> myImage.Height) Then
                Return myImage
            End If
            Dim bmp As Bitmap = New Bitmap(myImage)
            Dim size As Integer = myImage.Height
            Dim white As Integer = System.Drawing.Color.FromKnownColor(KnownColor.White).ToArgb()
            Dim i As Integer = 0
            While (i < size / 2)
                If (Not bmp.GetPixel(i, i).ToArgb().Equals(white)) Then Exit While
                If (Not bmp.GetPixel(i, size - 1 - i).ToArgb().Equals(white)) Then Exit While
                If (Not bmp.GetPixel(size - 1 - i, i).ToArgb().Equals(white)) Then Exit While
                If (Not bmp.GetPixel(size - 1 - i, size - 1 - i).ToArgb().Equals(white)) Then Exit While
                i += 1
            End While
            If (i > 0) Then
                i += 8
                Dim zone As Rectangle = New Rectangle(i, i, size - 2 * 1, size - 2 * i)
                Return bmp.Clone(zone, System.Drawing.Imaging.PixelFormat.DontCare)
            End If
            Return bmp
        End Function

        Private Function GetThumbnail(path As String) As Byte()
            Dim source As Image = Image.FromFile(path)
            source = AmazonCut(source)
            Dim height As Integer = source.Height
            Dim width As Integer = source.Width
            Dim factor As Integer = (height - 1) \ 250 + 1
            Dim smallHeight As Integer = height \ factor
            Dim smallWidth As Integer = width \ factor
            Dim thumb As Image = source.GetThumbnailImage(smallWidth, smallHeight, Nothing, IntPtr.Zero)
            Using ms As New MemoryStream
                thumb.Save(ms, ImageFormat.Png)
                ms.Flush()
                ms.Seek(0, SeekOrigin.Begin)
                Dim result(CInt(ms.Length)) As Byte
                ms.Read(result, 0, CInt(ms.Length))
                Return result
            End Using

        End Function

        Public Sub New()
            store = IsolatedStorageFile.GetUserStoreForAssembly
        End Sub

        Public Function GetThumbnail(host As String, filepath As String) As System.Windows.Media.ImageSource Implements IThumbnailManager.GetThumbnail
            Dim thumbName As String = Path.GetFileName(filepath)
            If (store.GetFileNames(thumbName).Length = 0) Then
                Using Stream As New IsolatedStorageFileStream(thumbName, FileMode.CreateNew, store)
                    Dim data() As Byte = GetThumbnail(filepath)
                    Stream.Write(data, 0, data.Length)
                End Using
            End If
            Using Stream As New IsolatedStorageFileStream(thumbName, FileMode.Open, store)
                Dim myImage As BitmapImage = New BitmapImage()
                myImage.BeginInit()
                myImage.CacheOption = BitmapCacheOption.OnLoad
                myImage.StreamSource = Stream
                myImage.EndInit()
                myImage.Freeze()
                Return myImage
            End Using
        End Function
    End Class
End Namespace

次に、追加のクラスを MainWindow.xaml.vb に追加し、彼が使用していた Load メソッドを追加しました。コンポーネントが機能した後も変更Ded.Tutorial.Wpf.CoverFlow.Part7.FlowComponent.FlowControlする必要がありました。Global.Ded.Tutorial.Wpf.CoverFlow.Part7.FlowComponent.FlowControlMainWindow.g.vb

MainWindow.xaml.vb

Imports System.IO
Imports System.Drawing.Imaging
Imports WpfApplication1.Ded.Tutorial.Wpf.CoverFlow.Part7


Class MainWindow

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        FlowControl1.Cache = New FlowComponent.ThumbnailManager
        Load("C:\Users\Marks-6520\Pictures\Alaska Trip")
        slider.Minimum = 0
        slider.Maximum = FlowControl1.Count - 1
    End Sub

    Public Sub Load(imagePath As String)
        Dim imageDir As DirectoryInfo = New DirectoryInfo(imagePath)
        Dim images As List(Of FileInfo) = New List(Of FileInfo)(imageDir.GetFiles("*.jpg"))
        images.Sort(New FileInfoComparer)
        For Each f As FileInfo In images
            FlowControl1.Add(Environment.MachineName, f.FullName)
        Next
    End Sub


    Private Sub slider_ValueChanged(sender As System.Object, e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Double))

        FlowControl1.Index = Convert.ToInt32(slider.Value)

    End Sub
End Class

Public Class FileInfoComparer : Implements IComparer(Of FileInfo)

    Public Function Compare(x As System.IO.FileInfo, y As System.IO.FileInfo) As Integer Implements System.Collections.Generic.IComparer(Of System.IO.FileInfo).Compare
        Return String.Compare(x.FullName, y.FullName)
    End Function
End Class
于 2013-01-21T01:30:04.663 に答える