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

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

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

WPF - ListView

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

    השאלה שלי איך משנים בזמן ריצה את התמונה המופיעה בכל שורה ב ListView ?

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

    תגובה 1 תגובה אחרונה
    0
    • 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
                          • דף הבית
                          • קטגוריות
                          • פוסטים אחרונים
                          • משתמשים
                          • חיפוש
                          • חוקי הפורום