דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. WPF - ListView

WPF - ListView

מתוזמן נעוץ נעול הועבר ארכיון code613m
12 פוסטים 2 כותבים 638 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD מנותק
    dovidD מנותק
    dovid ניהול
    כתב ב נערך לאחרונה על ידי
    #2

    אם אתה יודע איך משנים בזמן ציור, מסתבר ששמת בתוך הListView פקד Image.
    מסתבר ששמת את זה בטמפלט, אבל אני מנחש מידי הרבה.
    תעלה קוד זאמל רלוונטי לעניין. ואם זה לא סוד צבאי, כדאי גם שתרחיב על המטרות,
    כי אתה יכול לקבל "תשועה ברוב יועץ" איזה דרך לבחור מבין עשרות אפשרויות.

    פורסם במקור בפורום CODE613 ב17/10/2013 10:57 (+03:00)

    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

    בכל נושא אפשר ליצור קשר dovid@tchumim.com

    תגובה 1 תגובה אחרונה
    0
    • רחמיםר מנותק
      רחמיםר מנותק
      רחמים מורחק
      כתב ב נערך לאחרונה על ידי
      #3

      החלון שאני עוסק בו כעת אמור להציג תוכן תיקיה נבחרת, התוכן כולל קבצים ותקיות משנה, ואני רוצה להציג אותו ב ListView,
      עמודה הראשונה ב ListView תהיה האיקון של הקובץ או התקיה כפי שהוא מוגדר בריגיסטרי [ולזה יש לי קוד שמחלץ את האייקונים] ובשאר העמודות ב ListView אני מציג טקסט כמו שם הקובץ תאריך שינוי וכדומה.

      התיקיה שאותה אני רוצה להראות בתוך ה ListView משתנת כל פעם ע''י משתמש ולכן גם האיקונים צריכים להשתנות בהתאם.

      תודה רבה.

      <Window x:Class="Window1"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="Window1" Height="300" Width="765">
          <Grid>
              <ListView Margin="12,41,12,12"  ItemsSource="{Binding}"
                 GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"
                        SelectionMode="Multiple" Foreground="Black">
      
                  <ListView.View>
                      <GridView>
                          <GridViewColumn Header="ico"  Width="30" DisplayMemberBinding="{Binding ICON}"   CellTemplate="{Binding ICON}" />
                          <GridViewColumn Header="שם" Width="200"   />
                          <GridViewColumn  Header="תיקיה מכילה" Width="200"  />
                          <GridViewColumn Header="סוג"  Width="70"  />
                          <GridViewColumn Header="תאריך שינוי"  Width="200"  />
                          <GridViewColumn Header="גודל"  Width="100"   />
                      </GridView>
      
                  </ListView.View>
              </ListView>
          </Grid>
      </Window>
      

      פורסם במקור בפורום CODE613 ב17/10/2013 11:05 (+03:00)

      תגובה 1 תגובה אחרונה
      0
      • dovidD מנותק
        dovidD מנותק
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #4

        למה לא להביא xaml?
        חשוב לדעת איפה אתה אוחז.
        א. יש הרבה הרבה אפשרויות להציג מידע בפקדי xaml.
        ב. יש הרבה אפשרויות איך לנהל את הקוד מאחורה.
        ג. לליסטויו יש אפשרויות תצוגה טבלאית ואחרות.

        עשיתי דוגמה בסיסית עם פירוט רב כדי שתראה את היקף ההיבטים.
        קודם הXAML:

        <ListView  ItemsSource="{Binding Source={StaticResource CollForList}}" MouseDoubleClick="listFiles_MouseDoubleClick" >
            <ListView.View>
                <GridView>
                    <GridViewColumn >
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Image Source="{Binding icon}" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="שם" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn Header="תאריך שינוי" DisplayMemberBinding="{Binding DateChange}" />
                </GridView>
            </ListView.View>
        </ListView>
        

        הזאמל הזה עושה שימוש בריסורס, אביא אף אותו

        <Window.Resources>
            <CollectionViewSource x:Key="CollForList" />
        </Window.Resources>
        

        הקוד VB במקרה זה:

        Private Coll As CollectionViewSource
        Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
            Coll = Me.Resources("CollForList")
            ListBuilder(New IO.DirectoryInfo("c:\"))
        End Sub
        
        Private Sub ListBuilder(dirBase As IO.DirectoryInfo)
            Dim files = From file In dirBase.EnumerateFiles()
                        Select New FileOrFolder(file)
        
            Dim directories = From dir In dirBase.EnumerateDirectories
                              Select New FileOrFolder(dir)
        
            Coll.Source = files.Concat(directories)
        End Sub
        
        Private Sub listFiles_MouseDoubleClick(sender As Object, e As MouseButtonEventArgs)
            Dim f = TryCast(CType(e.OriginalSource, FrameworkElement).DataContext, FileOrFolder)
            If f IsNot Nothing Then
                If f.IsDir Then
                    ListBuilder(New IO.DirectoryInfo(f.FullName))
                End If
            End If
        End Sub
        

        הקוד משתמש במחלקה זאת:

        Class FileOrFolder
            Public FullName As String
            Public Property IsDir As Boolean
            Public Property Name As String
            Public Property DateChange As Date
            Public Property Image As ImageSource
        
            Public Sub New(file As IO.FileInfo)
                FullName = file.FullName
                Name = file.Name
                '....
            End Sub
            Public Sub New(dir As IO.DirectoryInfo)
                IsDir = True
                FullName = dir.FullName
                Name = dir.Name
                '....
            End Sub
        End Class
        

        תשלים את הקוד החסר (איפה שיש שלוש נקודות) לפי טעמך.
        יש כאן הרבה "הנחות עבודה". כל דבר שעשיתי אפשר אחרת.
        אבל זה מבט מהיר לאיך שWPF מתמודד עם נתונים.

        פורסם במקור בפורום CODE613 ב17/10/2013 13:05 (+03:00)

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        0
        • רחמיםר מנותק
          רחמיםר מנותק
          רחמים מורחק
          כתב ב נערך לאחרונה על ידי
          #5

          תודה רבה,
          כל זה הבנתי, אבל איפה האייקון?

          בקוד שלך הבאת:

          <GridViewColumn.CellTemplate>
                              <DataTemplate>
                                  <Image Source="{Binding icon}" />
                              </DataTemplate>
                          </GridViewColumn.CellTemplate>
          

          ואני עשיתי בקוד שלי אותו דבר:

          <GridViewColumn Header="ico"  Width="30" DisplayMemberBinding="{Binding ICON}"   CellTemplate="{Binding ICON}" />
          

          אבל האיקון לא מופיע כי לא שמנו כלום ב Public Property Image As ImageSource
          בקיצור איך אני מגדיר את המאפיין הזה בזמן ריצה ?
          ושוב תודה רבה.

          פורסם במקור בפורום CODE613 ב17/10/2013 14:45 (+03:00)

          תגובה 1 תגובה אחרונה
          0
          • dovidD מנותק
            dovidD מנותק
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #6

            ציפיתי שתיקח את מה ששלחתי הלאה, לא חשבתי שגמרתי.
            אתה צודק, טעיתי בכך שבחרתי את השם Image בקוד, אחרי שבXAML הפניתי לicon. צריך לשנות את אחד מהם כדי ששניהם יהיו אותו השם.

            כדי להציג את האייקון שלך, אני צריך לדעת איך אתה מחזיק אותו. כאייקון?

            פורסם במקור בפורום CODE613 ב17/10/2013 16:47 (+03:00)

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            0
            • רחמיםר מנותק
              רחמיםר מנותק
              רחמים מורחק
              כתב ב נערך לאחרונה על ידי
              #7

              אני משתמש בקוד הבא כדי לקבל איקונים:

              Imports System.Runtime.InteropServices
              
              Public Class SYS_ICO
              
                  Public Shared ICO_DIC As New Dictionary(Of String, Icon)
              
                   'This function get the icon for the specified file path extension
                  Public Shared Function GetIcon(ByVal filePath As String) As System.Drawing.Icon
                      Try
              
                          Dim ico As System.Drawing.Icon
                          'Get the extension
                          Dim ext As String = IO.Path.GetExtension(filePath)
                          ' בודק אם האיקון כבר קיים 
                          ICO_DIC.TryGetValue(ext, ico)
                          If ico IsNot Nothing Then
                              Return ico
                          End If
                          Dim shellFileInfo As New SYS_ICO.SHFILEINFO()
              
                          SYS_ICO.SHGetFileInfo(ext, 128, shellFileInfo, _
                                      Convert.ToUInt32(Marshal.SizeOf(shellFileInfo)), _
                                      Convert.ToUInt32(256I Or 1I Or 16I))
              
                          ico = System.Drawing.Icon.FromHandle(shellFileInfo.hIcon)
                          ICO_DIC.Add(ext, ico)
                          Return ico
                      Catch ex As Exception
                          Return My.Resources.איקון
                      End Try
              
                  End Function
              
                  <StructLayout(LayoutKind.Sequential)> _
                  Private Structure SHFILEINFO
              
                      Public hIcon As IntPtr
                      Public iIcon As Integer
                      Public dwAttributes As System.UInt32
                      <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
                      Public szDisplayName As String
                      <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
                      Public szTypeName As String
              
                  End Structure
              
              
                  <DllImport("Shell32.dll", ENTRYPOINT:="SHGetFileInfo")> _
                  Private Shared Function SHGetFileInfo(
                      ByVal pszPath As String,
                      ByVal dwFileAttributes As System.UInt32,
                      ByRef psfi As SHFILEINFO,
                      ByVal cbFileInfo As System.UInt32,
                      ByVal uFlags As System.UInt32) As IntPtr
                  End Function
              
              End Class
              

              פורסם במקור בפורום CODE613 ב17/10/2013 17:55 (+03:00)

              תגובה 1 תגובה אחרונה
              0
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                כתב ב נערך לאחרונה על ידי
                #8

                תחליף את תחילת הקוד, מההצהרה על הDictionary כולל, ועד סוף הפונקציה הראשונה,
                בקוד דלהלן:

                Public Shared ICO_DIC As New Dictionary(Of String, ImageSource)
                
                'This function get the icon for the specified file path extension
                Public Shared Function GetIcon(ByVal filePath As String) As ImageSource
                    Try
                        Dim wpfBitmap As ImageSource
                
                        'Get the extension
                        Dim ext As String = IO.Path.GetExtension(filePath)
                        ' בודק אם האיקון כבר קיים 
                        ICO_DIC.TryGetValue(ext, wpfBitmap)
                        If wpfBitmap IsNot Nothing Then
                            Return wpfBitmap
                        End If
                        Dim shellFileInfo As New SYS_ICO.SHFILEINFO()
                
                        SYS_ICO.SHGetFileInfo(ext, 128, shellFileInfo, _
                                    Convert.ToUInt32(Marshal.SizeOf(shellFileInfo)), _
                                    Convert.ToUInt32(256I Or 1I Or 16I))
                
                        Dim ico As System.Drawing.Icon = System.Drawing.Icon.FromHandle(shellFileInfo.hIcon)
                
                        wpfBitmap = FromIconToImageSource(ico)
                        ICO_DIC.Add(ext, wpfBitmap)
                        Return wpfBitmap
                    Catch ex As Exception
                        Return FromIconToImageSource(My.Resources.איקון)
                    End Try
                
                End Function
                
                Private Shared Function FromIconToImageSource(icon As System.Drawing.Icon) As ImageSource
                    Dim bitmap As System.Drawing.Bitmap = icon.ToBitmap()
                    Dim hBitmap As IntPtr = bitmap.GetHbitmap()
                
                    Dim wpfBitmap As ImageSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                                                    hBitmap,
                                                    IntPtr.Zero,
                                                    Int32Rect.Empty,
                                                    BitmapSizeOptions.FromEmptyOptions())
                    Return wpfBitmap
                End Function
                

                ואח"כ אתה שם את התוצאה במאפיין הImageSource של המחלקה דלעיל.

                פורסם במקור בפורום CODE613 ב17/10/2013 19:47 (+03:00)

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                0
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  כתב ב נערך לאחרונה על ידי
                  #9

                  אגב, אח"כ ערכת את הודעתך ושמת שם את הXAML.
                  ואחרי עיון בקוד שלך, ומזה שהשאלה שלך נסובה רק על האייקון,
                  מעניין אותי איך הצלחת להכניס ערכים טקסטואליים בכל העמודות (שם, גודל וכו') ?

                  פורסם במקור בפורום CODE613 ב17/10/2013 20:04 (+03:00)

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  תגובה 1 תגובה אחרונה
                  0
                  • רחמיםר מנותק
                    רחמיםר מנותק
                    רחמים מורחק
                    כתב ב נערך לאחרונה על ידי
                    #10

                    יפה מאוד, תודה רבה יישר כח!

                    @דוד ל.ט.

                    מעניין אותי איך הצלחת להכניס ערכים טקסטואליים בכל העמודות (שם, גודל וכו') ?

                    מה שעושים ב XAML עשיתי בקוד של הבנאי:
                    אתה נותן שם לכל עמודה בליסט-ויו

                       שם_עמודה.DisplayMemberBinding = New Binding("שם_המאפיין")
                    

                    פורסם במקור בפורום CODE613 ב17/10/2013 20:34 (+03:00)

                    תגובה 1 תגובה אחרונה
                    0
                    • רחמיםר מנותק
                      רחמיםר מנותק
                      רחמים מורחק
                      כתב ב נערך לאחרונה על ידי
                      #11

                      זה ממש נפלא כעת! האיקונים מוסיפים המון.
                      רק הבעיה שהם לא חדים אע''פ שהם מוצגים ברזולוציה המקורית שלהם, אותו דבר ב WINFORMS היא נראה יותר חד, יש מה לעשות עם זה?

                      פורסם במקור בפורום CODE613 ב17/10/2013 21:00 (+03:00)

                      תגובה 1 תגובה אחרונה
                      0
                      • dovidD מנותק
                        dovidD מנותק
                        dovid ניהול
                        כתב ב נערך לאחרונה על ידי
                        #12

                        @רחמים

                        זה ממש נפלא כעת! האיקונים מוסיפים המון.
                        רק הבעיה שהם לא חדים אע''פ שהם מוצגים ברזולוציה המקורית שלהם, אותו דבר ב WINFORMS היא נראה יותר חד, יש מה לעשות עם זה?

                        מעניין. תנסה סתם תמונה אחרת.

                        @רחמים

                        @דוד ל.ט.
                        מעניין אותי איך הצלחת להכניס ערכים טקסטואליים בכל העמודות (שם, גודל וכו') ?

                        מה שעושים ב XAML עשיתי בקוד של הבנאי:
                        אתה נותן שם לכל עמודה בליסט-ויו

                           שם_עמודה.DisplayMemberBinding = New Binding("שם_המאפיין")
                        

                        הבעיה שהקוד שלך לא הכיל בכלל שם לעמודות וגם לא לטבלה כולה לכן התפלאתי.

                        פורסם במקור בפורום CODE613 ב11/11/2013 15:18 (+02:00)

                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                        תגובה 1 תגובה אחרונה
                        0

                        בא תתחבר לדף היומי!
                        • התחברות

                        • אין לך חשבון עדיין? הרשמה

                        • התחברו או הירשמו כדי לחפש.
                        • פוסט ראשון
                          פוסט אחרון
                        0
                        • דף הבית
                        • קטגוריות
                        • פוסטים אחרונים
                        • משתמשים
                        • חיפוש
                        • חוקי הפורום