Bilder in WPF ListView anzeigen

  • WPF
  • .NET 5–6

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von PadreSperanza.

    Bilder in WPF ListView anzeigen

    Hallo,

    Ich schreibe ein Programm dass mir aktive Prozesse in einer ListView darstellt. Das Programm selbst funktioniert soweit, nur beim darstellen der Icons der Prozesse in einer eigenen Spalte komme ich nicht weiter.

    Ich habe in meinem Testfenster 2 ListView´s gemacht und verschiedene Arten von Bindings probiert, bisher ohne Erfolg.
    Auch die Umwandlung der Bilder von Icon in Bitmap oder Image habe ich versucht, alles erfolglos. Es wird mir nichts angezeigt in der Spalte.

    Über weitere Ansätze wäre ich sehr dankbar.

    MainWindow.xaml Versuch 1

    XML-Quellcode

    1. <ListView x:Name="listView1" ItemsSource="{Binding Path=ProzessList}">
    2. <ListView.View>
    3. <GridView>
    4. <GridViewColumn Header="Icon" DisplayMemberBinding="{Binding Path=Icon}" />
    5. <GridViewColumn Header="Prozessname" DisplayMemberBinding="{Binding Path=Prozessname}" />
    6. <GridViewColumn Header="Limit" DisplayMemberBinding="{Binding Path=Limit}" />
    7. <GridViewColumn Header="Prozessexe" DisplayMemberBinding="{Binding Path=Prozessexe}" />
    8. </GridView>
    9. </ListView.View>
    10. </ListView>


    MainWindow.xaml Versuch 2:

    XML-Quellcode

    1. <ListView x:Name="listView" ItemsSource="{Binding Path=ProzessList}" Margin="167,0,0,246" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Left" Width="632">
    2. <ListView.View>
    3. <GridView>
    4. <GridViewColumn Header="Icon" DisplayMemberBinding="{Binding Icon}">
    5. <GridViewColumn.CellTemplate>
    6. <DataTemplate>
    7. <StackPanel Orientation="Horizontal">
    8. <Image Source="{Binding Icon}"/>
    9. </StackPanel>
    10. </DataTemplate>
    11. </GridViewColumn.CellTemplate>
    12. </GridViewColumn>
    13. <GridViewColumn DisplayMemberBinding="{Binding Prozessname}"
    14. Header="Prozessname"
    15. Width="Auto"/>
    16. <GridViewColumn DisplayMemberBinding="{Binding Limit}"
    17. Header="Limit"
    18. Width="Auto"/>
    19. <GridViewColumn DisplayMemberBinding="{Binding Prozessexe}"
    20. Header="Prozess.exe"
    21. Width="Auto"/>
    22. </GridView>
    23. </ListView.View>
    24. </ListView>



    im .vb code die class erstellt:

    VB.NET-Quellcode

    1. Public Class Prozess
    2. Public Sub New(ByVal Icon As Image, ByVal Prozessname As String, ByVal Limit As String, ByVal Prozessexe As String)
    3. Me.Icon = Icon
    4. Me.Prozessname = Prozessname
    5. Me.Limit = Limit
    6. Me.Prozessexe = Prozessexe
    7. End Sub
    8. Public Property Icon As Image
    9. Public Property Prozessname As String
    10. Public Property Limit As String
    11. Public Property Prozessexe As String
    12. End Class


    Als Eigenschaft von Main Window und den Sub der die Prozesse auslest:

    VB.NET-Quellcode

    1. Class MainWindow
    2. Public Property ProzessList As New ObservableCollection(Of Prozess)
    3. Private Sub ME_loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    4. Me.DataContext = Me
    5. End Sub
    6. '##################### auflisten aller aktiven Prozesse #####################
    7. Private Sub Prozesse_auflisten_Click(sender As Object, e As RoutedEventArgs) Handles Prozesse_auflisten.Click
    8. Dim Prozessliste As New List(Of String)
    9. InitializeComponent()
    10. For Each Process As Process In Diagnostics.Process.GetProcesses
    11. If Not Prozessliste.Contains(Process.ProcessName) Then
    12. Try
    13. Prozessliste.Add(Process.ProcessName)
    14. Dim img As Image = System.Drawing.Icon.ExtractAssociatedIcon(Process.MainModule.FileName).ToBitmap
    15. ProzessList.Add(New Prozess(img, Process.ProcessName, "", Process.MainModule.FileName))
    16. Catch
    17. End Try
    18. End If
    19. Next
    20. End Sub
    21. End Class


    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „alex156“ ()

    Ich habe die Lösung gefunden.

    Ich speichere die Bilder in einen Temp Ordner ab und weise dann den Dateipfad der img - Variable zu. Die Property "icon" ist dann kein icon sondern auch ein String (der Filepath des Bildes).

    Anzeige funktioniert dann mit MainWindow.xaml Versuch 2, aber da gibts bei google ansonsten eh genug Beispiele.
    Du kannst das auch ohne das vorherige Speichern des Bildes machen, indem du das Binding mittels Converter realisierst. WPF hat einige Standard-Converter. Die meisten nehmen Strings entgegen und bewerten diese und wandeln sie in entsprechendes um. Bei Image ist es zum Beispiel der Pfad, wo das entsprechende Bild liegt. Die Eigenschaft Image selbst aber braucht eine Datei vom Typ BitmapImage. Das wiederum kannst du konvertieren:

    XML-Quellcode

    1. <... Converter="ImageConverter" />


    und im ImageConverter kannst du ein BitmapImage erstellen und zurückgeben:

    C#-Quellcode

    1. public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
    2. {
    3. ​Icon icon = System.Drawing.Icon.ExtractAssociatedIcon((string)value);
    4. ImageSource imageSource = Imaging.CreateBitmapSourceFromHIcon(
    5. icon.Handle,
    6. Int32Rect.Empty,
    7. BitmapSizeOptions.FromEmptyOptions());
    8. return imageSource;
    9. }


    Wenn du nun ein Image anzeigen lässt, kannst du dessen Source-Eigenschaft mittels Converter zur Anzeige bringen. Es muss dann jedoch ein Image-Control sein.