@dovid כתב במראה יותר אחיד ויפה לפקד ב-wpf:
אתה יכול לשים רווח ביניהם. אני לא זוכר איך עושים כזה דבר בWPF.
אני לא בטוח שאני צודק, אבל אני חושב שאין כזה פנל ב-wpf.
(אבל אפשר לבנות פנל מותאם אישית)
@dovid כתב במראה יותר אחיד ויפה לפקד ב-wpf:
אתה יכול לשים רווח ביניהם. אני לא זוכר איך עושים כזה דבר בWPF.
אני לא בטוח שאני צודק, אבל אני חושב שאין כזה פנל ב-wpf.
(אבל אפשר לבנות פנל מותאם אישית)
אתה יכול להשתמש עם GridLengthConverter
private static GridLengthConverter _gridLengthConverter = new GridLengthConverter();
private static GridLength ParseGridLength(string value)
{
return _gridLengthConverter.ConvertFromString(value);
}
עוד משהו, מקובל להפריד עם עם רווח ולא רק פסיק.
ואגב אני חושב שזה הגיע מ - WinUI עוד לפני Avalonia
@pcinfogmach לבעיה עצמה אין לי פתרון, כנראה designer לא מושלם
מה שאתה יכול לעשות:
א) לקבוע את הגודל והמרחק לפי איך שזה נראה ב - word ולא לפי ה - designer.
ב) לעשות Grid עם חלוקה קבועה וככה זה יתחלק בצורה שווה גם אם הפונט ישתנה.
@pcinfogmach כתב ברענון הרשימה של ה-combobox ב-wpf בכל פתיחה.:
רצה על ה-thread העיקרי
אם אתה מריץ את זה בצורה הבאה, זה רץ על thread נפרד:
var xml = await Task.Run(() => ActiveDocument.Content.WordOpenXML);
כמדומני שקראתי בעבר שוורד לא באמת בנוי בצורה שתומכת threading
יתכן שהכוונה שהוא לא בטוח עם ריבוי threadים, אבל בהחלט אפשרי.
@pcinfogmach אפשר גם לעדכן רק על פי בקשת המשתמש, כלומר שאם הוא יפתח את רשימת הצבעים ויראה שאין את הצבע שהוא מחפש הוא ילחץ על כפתור ("רענן צבעים" לדוגמא) שיחלץ את הצבעים מחדש.
אפשרות נוספת:
כשהמשתמש פותח את הקומבו, להציג לו את הנתונים ששמורים במטמון מהפעם הקודמת, ובמקביל ב - Thread נפרד לחשב מחדש את הערכים, וכשהם מוכנים לשמור אותם למטמון ולעדכן את הקומבו הפתוח (אם הוא עדין פתוח).
@pcinfogmach לכאורה התקיעה מתרחשת בזמן שאתה מאחזר את הצבעים מה xml, מה שעולה לי בראש זה:
א. להריץ את פעולות ה Regex ב - Thread נפרד (עם Task.Run), בתוספת מחוון קטן ב - UI שהתוכנה כעת חושבת ויש לחכות כמה שניות.
ב. לעשות אופטימיזציה לפעולה עצמה, לדוגמא שימוש בניתוח xml ולא regex (ב - #C עם LINQ זה די טריוויאלי). עוד אפשרות שעולה לי בראש, זה לעקוב ב - Thread נפרד אחרי השינויים של הקובץ (אם יש אירוע שכזה) ובכל פעם שהקובץ משנה לעדכן את רשימת הצבעים, עוד לפני שהמשתמש פותח את הקומבו בוקס.
@yossiz ומה יקרה אם יהיו 512 זוגות גלגלים? למה זה כן מותר?
@OdedDvir תודה! אבל לצערי זה לא פתר את הבעיה..
@יהודי-טוב כתב בTTS ונרמול דאטה:
התמלול הזה מאוד דומה לתמלול של openAI (הגיוני שזה על מודול שלהם)
המודל של OpenAI נקרא whisper והפרויקט הנ"ל של העברית הוא גם whisper שעבר fine-tuning על הרבה נתונים בעברית.
אגב יצא לי לבדוק את whisper עם whisper.cpp (שזה זמן ריצה של whisper) והתוצאות היו ממש טובות, לסרטון אקראי של 10 דקות התמלול היה מצוין עם טעויות בודדות, אבל בגרסאות הקטנות יותר (מתחת ל - medium) התמלול היה על הפנים.
@pcinfogmach כתב בסקיצה איך ליישם Theming ב- wpf בצורה קלה ונוחה:
אם כבר אנחנו מדברים על spinoff של wpf מה אתה אומר על uno? לא ניסיתי את זה מעניין לשמוע ממישהו שכן ניסה אם יש?
לא התנסתי ב- uno, אבל נדמה לי שזה שילוב פלטפורמות קיימות של microsoft לבסיס אחד, זה לא באמת ממשק משתמש שנכתב מאפס, יש גם את maui. אני חושב ש - avalonia מתמקדת יותר בפיתוח desktop חוצה פלטפורמות, ופחות ל - mobile (כיום יש תמיכה רחבה גם ל - mobile אבל בעבר זו לא היה יציב)
סתם ככה היה לי הרגשה של "כמעט" כשהתעסקתי עם avalonia לא באתי ללכלך אבל מסקרן אותי כמה ההרגשה הזו אישית והאם יש בה ממש.
אני כיום מפתח עבור desktop רק עם avalonia בלי מחשבה לחזור אי פעם ל wpf.
@dovid כתב בשימוש נכון ב-await Task.Run ב-C#:
ובCPU, צריך לעשות ממש דברים רציניים מאוד כדי שתהיה הצדקה לקפיאה.
באפליקציה קלאסית נתקלים בזה כשמריצים סינון על הרבה פריטים באמצעות תיבת חיפוש, ולפעמים ה - UI קופא לזמן קצר, במקרה הזה הפתרון להשתמש ב - Task.Run.
יש שני סיבות למה להשתמש בכלל בTask:
א. לומר לתוכנה שהיא לא צריכה הרגע לחכות לתוצאה, אלא לכשתגיע נדבר.
ב. לנצל את ריבוי המעבדים.
הייתי מגדיר את זה טיפה שונה: המטרה העיקרית של Task ו - async/await היא לא לחסום את ה - thread הראשי. המושג הכללי multi-threading נועד גם בין היתר לנצל את ריבוי המעבדים.
@pcinfogmach כתב במדריך: איך לייצר לוקליזציה ב-wpf בצורה פשוטה וקלילה:
כשאתה בונה כמה פרוייקטים במקביל הפעולות המכניות הזוטרות האלה שחוזרים על עצמם שוב ושוב מתחילים להציק לך מאוד
הפתרון הוא לכתוב ספרייה משותפת שמאגדת את כל הבסיס לפרויקטים שלך, לדוגמא: classים בסיסיים של ViewModel (או reference לספריית MVVM כלשהיא), Localization, Theme, DI וכל מה שאתה משתמש
בכל פרויקט חדש אתה פשוט מוסיף reference לספרייה המשותפת (ואולי עוד כמה שורות קוד), וככה חסכת הרבה זמן בהקמה של הפרויקט
@pcinfogmach לא עברתי על כל הקוד, אבל זה נראה מלמעלה שאי אפשר לשנות את השפה בזמן הריצה של האפליקציה, תנסה ליישם משהו שמאפשר לשנות את השפה בצורה דינאמית, מבלי להפעיל מחדש
לבסוף מצאתי איזה ריפו ישן ב - GitHub שעל פיו הוספתי את הקבצים הבאים:
// webpack.config.js
const path = require("path");
module.exports = {
entry: "./src/index",
mode: "production",
output: {
globalObject: "this",
path: path.resolve(__dirname, "dist"),
filename: "drop-word-script.js",
},
module: {
rules: [
{
test: /\.(ts|js)$/,
loader: "babel-loader",
options: {
presets: [["@babel/preset-env", { loose: true, modules: "commonjs" }], "@babel/preset-typescript"],
},
},
],
},
resolve: {
extensions: ['.ts', '.js'],
},
optimization: {
minimize: false, // minification may produce syntax errors because ExtendScript does not support nested ternary operators without parentheses
},
target: "browserslist",
};
// tsconfig.json
{
"compilerOptions": {
"target": "ES6",
"module": "CommonJS",
"moduleResolution": "Node",
"noEmit": true,
"skipLibCheck": true,
"types": [
"types-for-adobe/InDesign/2021"
]
},
}
// package.json
{
"name": "drop-word-script",
"version": "1.0.0",
"main": "dist/drop-word-script.js",
"scripts": {
"build": "npm run check-types && npm run build:bundle",
"build:bundle": "webpack",
"build:compile": "npx jsxbin -i dist/drop-word-script.js -o dist/drop-word-script.jsxbin",
"check-types": "tsc --noEmit"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.25.2",
"@babel/preset-env": "^7.25.4",
"@babel/preset-typescript": "^7.24.7",
"babel-loader": "9.1.3",
"jsxbin": "^2.2.0",
"types-for-adobe": "^7.2.1",
"typescript": "^5.6.2",
"webpack": "^5.94.0",
"webpack-cli": "^5.1.4"
}
}
// .browserslistrc
ie 6
אשמח לשמוע אם יש מקום לשיפור
אגב, סתם שאלה מעניינת, האם כתיבת דרייברים בשפת rust תתרום לעניין? כידוע הרבה מהקריסות ב - kernel נובעות מבעיות של ניהול זיכרון.
@pcinfogmach עוד אופציה למיטוב ביצועים, זה להשתמש ב - StringBuilder
עם AppendLine
, ולא עם Where
ו - string.Join
@dovid כתב בC# webview2 navigatetostring- טעינת טקסט בפקד:
תקרא לה מייד אחרי הInitializeComponent כדי שזה "יספיק" להיטען,
או שתוסיף לפניה await (ותוסיף למתודה async).
או לחילופין תקרא לה ככה: ()EnsureCoreWebView2Async().Wait
, זה יעצור את הטרד הנוכחי עד שהפונקציה תסתיים.
(מומלץ מאוד להשתמש ב async / await)
חלון קלאסי מקבל את העיטורים והלחצנים (של ה'סגור', 'מזער' וכו') ממערכת ההפעלה, זה משתנה בין מערכות הפעלה וזה כולל גם את הצל שמסביב, אם אתה רוצה חלון ללא עיטורים תגדיר את WindowStyle
ל - None
, בכזה מקרה תקבל מלבן לבן בלי שם דברים מסביב.
@WWW במקרה שלך זה בלתי אפשרי לייצר מספר בן 10 ספרות ממספר בן 5 ספרות.
הפתרון הוא שהקוד הנגדי יהיה באורך של 8 ספרות (זהה לאורך של מספר פלא' חוץ מהקידומת הקבועה 05, כמו שכתבו פה) ואז להפוך את המספר פלאפון איכשהו (xor לדוגמא) לקוד הנגדי, ובאותה דרך לשחזר למספר הפלאפון שהמשתמש הזין.
תשובה לשאלה הראשונה:
הסרוויס צריך להכיל את כל המידע ולהפיץ אותו בכמה שיטות לקומפוננטות כך שהם יוכלו לקבל אותו באיזה צורה שהם רוצים (מידע קצר / מידע מלא), במקרה שזה ממש הרבה קוד לסרוויס אחד אולי באמת מומלץ לפצל את זה לשני סרוויסים (שמקושרים אחד לשני)