אגב, אח"כ ערכת את הודעתך ושמת שם את הXAML.
ואחרי עיון בקוד שלך, ומזה שהשאלה שלך נסובה רק על האייקון,
מעניין אותי איך הצלחת להכניס ערכים טקסטואליים בכל העמודות (שם, גודל וכו') ?
פורסם במקור בפורום CODE613 ב17/10/2013 20:04 (+03:00)
אגב, אח"כ ערכת את הודעתך ושמת שם את הXAML.
ואחרי עיון בקוד שלך, ומזה שהשאלה שלך נסובה רק על האייקון,
מעניין אותי איך הצלחת להכניס ערכים טקסטואליים בכל העמודות (שם, גודל וכו') ?
פורסם במקור בפורום CODE613 ב17/10/2013 20:04 (+03:00)
תחליף את תחילת הקוד, מההצהרה על ה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)
ציפיתי שתיקח את מה ששלחתי הלאה, לא חשבתי שגמרתי.
אתה צודק, טעיתי בכך שבחרתי את השם Image בקוד, אחרי שבXAML הפניתי לicon. צריך לשנות את אחד מהם כדי ששניהם יהיו אותו השם.
כדי להציג את האייקון שלך, אני צריך לדעת איך אתה מחזיק אותו. כאייקון?
פורסם במקור בפורום CODE613 ב17/10/2013 16:47 (+03:00)
למה לא להביא 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)
אם אתה יודע איך משנים בזמן ציור, מסתבר ששמת בתוך הListView פקד Image.
מסתבר ששמת את זה בטמפלט, אבל אני מנחש מידי הרבה.
תעלה קוד זאמל רלוונטי לעניין. ואם זה לא סוד צבאי, כדאי גם שתרחיב על המטרות,
כי אתה יכול לקבל "תשועה ברוב יועץ" איזה דרך לבחור מבין עשרות אפשרויות.
פורסם במקור בפורום CODE613 ב17/10/2013 10:57 (+03:00)
אם מוגדר לItemsControl (במקרה זה ליסט), הItemsSource, הדרך הטבעית והפשוטה ביותר זה להוסיף את האיבר למקור הנתונים.
במקרה זה כתבת שמקור הנתונים זה "עמודה בטבלה".
זה ניסוח שגוי מאוד. מקור הנתונים חייב להיות IEnumerable<T>, ועמודה בטבלה היא אובייקט שממש לא מממש את הציפיה הזו.
נניח שכנראה הT הוא DataRow. אז צריך להוסיף DataRow, השאלה היא מה ה"מיכל" של הDataRow הללו. אם זה טבלה, אז אפשר להוסיף לה שורה, אבל אם זה שאילתת לינק או מערך, א"א להוסיף איבר.
אם האוסף הוא אוסף של מספר שלם, ולא של DataRow כמו שסברתי לומר, אז באמת א"א להוסיף Null. אפשר להתגבר על זה, או להפוך את האוסף מסוג Int לסוג ?Int, וזה מאפשר איברים Null, ישנה עוד אפשרות אולי, אבל זה מאוד תלו ברקע: למה איך ועוד.
מאוד עוזר גם להראות מה ניסו ואיפה נכשלו.
אפשר בדרך שונה לחלוטין (זה מאוד תלוי המטרה), למזג בזאמל את הרשימה עם רשימה/איברים אחרים.
ראה כאן.
בהצלחה.
פורסם במקור בפורום CODE613 ב13/10/2013 20:11 (+03:00)
אנא ערוך את השאלה, היא לא מובנת.
פורסם במקור בפורום CODE613 ב13/10/2013 15:59 (+03:00)
Using משמש בעיקר לוודא שבתום השימוש תיקרא הפונקצייה Dispose.
וזאת גם אם תוכנ עפה באמצע השימוש (מאחורי הקלעים הקומפיילר בונה tyr מסביב).
הפונקציה Dispose דואגת לשחרור השימוש/זיכרון מהאובייקט.
משתמשים בUsing בכל דבר "יקר": קבצים וכדו'.
בפועל using גם משמשת כבלוק, הצהרת הכותרת שלה והצהרות בתוכה,
מאבדים את טווח ההכרה מחוצה לה.
פורסם במקור בפורום CODE613 ב10/10/2013 18:38 (+03:00)
הפונקציה שהבאת יוצרת קובץ ומחזירה אובייקט StreamWriter בקידוד לUTF8,
כך ששאני באמת מאוד מתפלא למה זה לא עובד.
(האנקודינג שכתבת לא אמור לעזור, אין זה מקומו וגם אין לו מקום אחרי יצירת הסטרים).
הקוד דלהלן עובד:
var fileName = "tests.csv";
using (StreamWriter sw = new StreamWriter(File.Open(fileName, FileMode.Create), Encoding.UTF8))
{
sw.Write("אבג ABC 123");
}
אני בכלל עובד אחרת: אני קודם יוצר סטרינג ארוך ואח"כ מכניס לתוך הקובץ בבת אחת ככה:
var strBldr = new StringBuilder();
strBldr.Append("אבג ABC 123");
File.WriteAllText(fileName, strBldr.ToString(), Encoding.GetEncoding(1255));
שים לב שכיון שבשם קובץ אפשר לכותב נתיב יחסי, אז אתה לא להשיג את כתובת הנתיב המוחלט.
לכן אפשר לכתוב בתור שם קובץ "file.csv" והוא יווצר בתייקה בה התוכנה נמצאת.
או "dir\file.csv" ואז הוא יווצר בתייקה dir שבתוך התיקייה ממנה התוכנה רצה.
פורסם במקור בפורום CODE613 ב10/10/2013 14:09 (+03:00)
בשאילתה אתה מוסיף עמודת ביטוי, ולפיה אתה ממיין.
הביטוי צריך להיראות ככה:
Mid([ColumnName], 1, 5)
כאשר ColumnName זה שם העמודה, ואתה ממיין לפי עמודת הביטוי ולא העמודה המקורית.
שים לב שזה מיון טקסטואלי, כלומר האות 9 גדולה מהאות 8 אפי' שאחרי ה9 יש נגיד רק ספרה אחת ואחרי ה8 יש 4.
בדרך כלל זה לא משנה כי כל המיקודים באותו אורך (לא פחות ולא יותר מחמש).
אם אתה רוצה שהמיון יהיה מספרי,
אתה צריך עטוף את הפונקצייה דלעיל בביטוי Val שממירה למספר.
אם העמודה המקורית היא כבר מספר, יותר קצר לכתוב ביטוי שבודק אם זה גדול מ99999 ואם כן מחלק במאה.
ככה:
iif([ColumnName]>99999, [ColumnName]/100, [ColumnName])
ולמיין לפי הביטוי כמובן.
הצלחה,
[size=85:fsxvlofl]ותמיד, תמיד, לשאול בפורום...[/size:fsxvlofl]
[u:fsxvlofl][size=150:fsxvlofl]עריכה:[/size:fsxvlofl][/u:fsxvlofl]
רק כעת שמתי לב לכותרת בה כתוב LINQ.
אני חשבתי שהמדובר על אקסס.
אז בלינק זה יותר פשוט אפי'...
order by Mikud.SubString(0,5)
או אם זה מספרי:
order by (Mikud > 99999 ?? Mikud / 100 : Mikud) (0,5)
השורה הזאת משתמשת עם ביטוי-תנאי, ביטוי שהרבה מתכנתים שוכחים מקיומו.
בלי הביטוי אז צריך לעשות פונקציה (מלאה או למבדה), ולתת את הערך החוזר לorder by.
פורסם במקור בפורום CODE613 ב09/10/2013 17:43 (+03:00)
לדעתי יש כאן נידון של "דת ומדינה" וכבר דיברתי על זה עם דוד ל.ט. כמה פעמים, זה קצת מזכיר גם את הויכוח בין הלינוקסאים, לבין משתמשי מייקרוסופט, אקסס זה המיצוי של העולם המייקרוסופטי, איך שהגדיר את זה פעם חבר שלי, מייקרוסופט זה כמו בית אבות סיעודי, אתה יושב על כיסא גלגלים, וכל מה שהגוף צריך מספקים לו עד למקום. לינוקס ועולם הקוד הפתוח, זה העולם החופשי, שבו אתה יכול לרוץ לכל מקום שאתה רוצה גם עד ל VHDL אם יש צורך, בלי להצטרך לשום שירות סיעודי (אם כי קיימים בלי סוף למי שמעוניין, אבל זה לא "משעבד" אותך, וזה ההבדל הגדול)
ואז עונים משתמשי מייקרוסופט, אתה לא תוכל להיות תחרותי אם תנסה לכתוב הכל מאפס, אנחנו חיים במשק מווסת מחירים, הזמן שאנחנו חיים הוא משאב מוגבל לעת עתה, וצריך לדעת שפרוייקט שלקוח שנתיים בקוד פתוח, יכול לקחת חודשיים בדוט נט וכדומה. אז זה אותו ויכוח מבחינת התוכן. אם הלקוח צריך משהו שאקסס מספיק לו, אתה יכול לכתוב תוכנה ב 3 שעות, מה שייקח לך בדוט נט וסביבותיה, בערך חודש. איי מה תגיד, מה יקרה אם הלקוח ירצה משהו שאין באקסס, התירוץ הוא מציעים לו פתרון עוקף, או שמסבירים לו שאם היינו הולכים בדרך אחרת, זה היה עולה לו פי שמונה, ברוב המקרים התירוץ הזה עובד לא רע בכלל. מניסיון.אז אם כבר, אפשר לפתוח את הויכוח העתיק והבלתי נגמר, בין עולם הקוד הפתוח, התקן הבינלאומי, האינטרנט הנייטרלי על כל בעיות הכאוס לכאורה שיש שם. לבין העולם החשוך של מייקרוסופט, שבו יש אוליגרכיה גמורה שלטון ללא מצרים שמכריח אותך לעבוד איתם בכל תחום וכן הלאה. אז אולי כבר נדון על דת ומדינה, או על צורות שלטון.
אני מבקש סליחה אם נסחפתי, אבל לדעתי זהו הדיון האמיתי כאן.
אני מסכים שהשאלה מה יותר טוב היא חסרת תכלית וקץ.
אבל עדיין אפשרי לפתות מתכנת להצטרף למחנה זה או אחר,
בלי ויכוחים מייגעים אלא עם נקודות מעשיות.
וחוץ מזה, ארכיטקט, עוד לא אמרתי את המילה האחרונה (לטובת דוט נט
אלא מה).
פורסם במקור בפורום CODE613 ב13/10/2013 17:44 (+03:00)
אולי תעלה כאן איזו דוגמא קלאסית של תוכנה לניהול מכירות כמו Northwind שיש באקסס רק שתהיה עם C#+WPF ?
תודה.
הגזמת קצת..
אבל בא נעשה ככה, ניקח את המסד ההוא, ונעשה צעד אחד צעד תצוגות ופעולות.
אז עוד מעט אני מעלה את המודל הראשוני.
פתחתי לזה אשכול במדריכים.
אגב, אני אישית כותב בVB.NET, אך הלומדים בד"כ רוצים C# והיא יותר באופנה.
אולי נכתוב בשתיהם.
פורסם במקור בפורום CODE613 ב09/10/2013 13:37 (+03:00)
עכ"פ, אין על מיקרוסופט 
אבל "הרוצה להחכים", ברגע שיש לך עצבים לעזוב את אקסס (כלומר: ללמוד קצת דברים אחרים),
אני כאן בשביל לתת לך את כל הדרוש למצוא מזור אחר (כמובן גם מיקרוספטי כמו C#+WPF וכדו').
פורסם במקור בפורום CODE613 ב09/10/2013 11:26 (+03:00)
אבל קיבלתי שגיאה: [code]Could not load file or assembly 'libpdf.dll' or one of its dependencies. המודול שצוין לא נמצא.
שים את כל הDLL בתיקיית ההרצה ונסה שוב.
נכון, אבל תקן אותי אם אני טועה, אני חושב שכיון שיש לנו את כל המידע על דף הPDF אנו יכולים ליצור תמונה עם פקודות DrawImage ו DrawString שהרי זה לא בעיה לחלץ מתוך הדף את התמונות שלו וכן כנראה יש דרך לדעת כל אות ואות מה ה X וה Y שלה וכן מה הגופן שלה וכו' וכך אפשר ליצור תמונה שתראה ממש כמו דף ה PDF. מי שמכיר את ITEXT טוב בטח ידע להגיד אם אני צודק או לא.
אענה לך רק, שקיימות בקושי תוכנות בשוק להצגת PDF, וזה מראה שהמשימה שלך לא קלה.
אם המידע היה בצורה מסודרת כמו שאתה אומר, אז ברור שהיה גם קל לרנדר.
הבעיה שיש מידי שלל של אפשרויות בPDF. לדוגמא לפעמים מצויין מרווח בין תווים, ולפעמים רק את גודל השורה הסופי ולפעמים וכו'.
פורסם במקור בפורום CODE613 ב06/10/2013 13:22 (+03:00)
מצאתי את הפרוייקט שעשיתי.
הוא משתמש במחלקה הזאת: https://github.com/mephraim/ghostscriptsharp.
(צריך לקמפל את הפרוייקט GhostScriptSharp, ולהוסיף רפרנס אליו, וגם לייבא לפרוייקט את הDLL שבתיקייה ThirdParty (זה הGhostScript). במאפייני הDLL בVS צריך לדאוג שיהיה Copy בAction).
הנה קוד פשוט:
GhostscriptSharp.GhostscriptWrapper.GeneratePageThumb(fileName, "c:\1.gif", 1, 100, 100)
הפרמטרים: מקור, יעד, עמוד, מימד אורך ורוחב.
אבל הלינק ההוא מגוגל קוד אולי שווה הצצה.
פורסם במקור בפורום CODE613 ב03/10/2013 18:49 (+03:00)
תודה, אם אפשר אני מעדיף להמשיך לעבוד עם ITEXT כיון שבכל מקרה הוא כבר שימוש אצלי ועדיף לי למעט בנפח, אבל אי אפשר אשמח לקבל דוגמאות אחרות.
אני הבנתי מייד שאתה מעדיף, אבל באמת זה לא אפשרי.
iTextSharp לא מטפל כלל וכלל ברינדור PDF לתצוגה, וממילא זה ממש לא התפקיד והתחום שלו.
פורסם במקור בפורום CODE613 ב03/10/2013 17:43 (+03:00)
אני עשיתי כזה דבר בעבר ע"י הספרייה GhostScript.
אינני זוכר בדיוק פרטים, אבל נסה לראות כאלו שעשו, כמו:
http://www.codeproject.com/Articles/32274/How-To-Convert-PDF-to-Image-Using-Ghostscript-API
אם אתה עדיין לא מצליח אחפש את הקוד שלי.
עכשיו בחיפוש מצאתי משהו שנראה קל יותר:
https://code.google.com/p/lib-pdf/
פורסם במקור בפורום CODE613 ב03/10/2013 13:04 (+03:00)
אין צורך לשייך אירוע לכל פקד בטופס גם ב-WPF יש אפשרות של KEYPREVIEW בטופס כך שכל אירוע בפקד יודיע לטופס שהתרחש.
אם כי טעית בלשונך, שהרי אין כזה מאפיין KeyPreview בטופס WPF, אבל בגלל הרעיון שלך מצאתי שיש אירוע בשם KeyDownPreview והוא מודיע בכל מקרה.
תודה!
פורסם במקור בפורום CODE613 ב08/10/2013 11:18 (+03:00)
אתה חייב לשייך אירוע לחיצה לכל פקד אחר בטופס.
KeyDown="MethodeName"
(וכמובן גם לטופס עצמו).
באירוע אתה בודק שהKey הוא Enter ואם כן אתה קורא לפונקציה Focus של הפקד המתבקש.
טיפ: אתה לא צריך לכתוב מתודה לכל אירוע, אותה אחת יכולה לטפל בכל הפקדים והטופס.
פורסם במקור בפורום CODE613 ב02/10/2013 16:51 (+03:00)
" fsdfsd".Trim();
פורסם במקור בפורום CODE613 ב02/10/2013 16:41 (+03:00)