מצאתי פיתרון:
Dispatcher.BeginInvoke(new Action(() =>
{
Keyboard.Focus(SearchTextBox);
}), System.Windows.Threading.DispatcherPriority.ApplicationIdle);
ברוב המקרים זה עוזר אא"כ בהרצת הרבה פעולות ברצף מהיר מאוד.
מצאתי פיתרון:
Dispatcher.BeginInvoke(new Action(() =>
{
Keyboard.Focus(SearchTextBox);
}), System.Windows.Threading.DispatcherPriority.ApplicationIdle);
ברוב המקרים זה עוזר אא"כ בהרצת הרבה פעולות ברצף מהיר מאוד.
@קומפיונט כתב באייקון הסר הדגשת טקסט ואייקון הסר כתב נטוי:
שאלה צדדית: מה ההבדל בין "רגיל" ל - "בלתי מודגש"?
צודק לא כתבתי מספיק ברור
במקום רגיל הייתי צריך לכתוב: כל העיצובים כלומר:
אפשרות א' - דוקא מודגש
אפשרות ב' - דוקא לא מודגש
אפשרות ג' - לא משנה מודגש או לא
דרוש אייקון (עדיף SVG) עבור לחצן הסרת הדגשת טקסט ולחצן הסרת כתב נטוי.
המטרה היא להגדיר שלוש מצבים עבור פקודות חיפוש והחלפה: מודגש, רגיל, ובלתי מודגש.
כל פעם שאני מריץ את הפקודה
range.Font.get_Style()
וורד גונב את הפוקוס מפקד ה-wpf שלי.
מה אפשר לעשות?
@קומפיונט כתב ברענון הרשימה של ה-combobox ב-wpf בכל פתיחה.:
ובמקביל ב - Thread נפרד לחשב מחדש את הערכים
הפעולה
string xml = ActiveDocument.Content.WordOpenXML;
רצה על ה-thread העיקרי
כמדומני שקראתי בעבר שוורד לא באמת בנוי בצורה שתומכת threading (רק משהו חיצוני לוורד אפשר אבל לא פונקציות של וורד עצמו).
הקוד הבא מיועד לתוספים ב-Word המבוססים על WPF.
הוא נועד להגדיר את חלון ה-WPF כחלון בן (Owned Window) של Word. חלון בן מתנהג באופן שונה מחלון עצמאי בכך שאינו מקבל פוקוס חוץ מחלון האב, והוא ממוזער יחד איתו. התנהגות שמצוייה בחלון דיאולוג שמקושר לחלון הפתוח. אחרת החלון יתנהל כמו תוכנה נפרדת לחלוטין מצד אופן התצוגה שלו ואף יופיע מעל חלונות של תוכנות אחרות שאינם קשורות אליו כלל.
//יש להוסיף שם מחלקה - את שם הפרוייקט של התוסף אחרת globals לא ייקלט
using System;
using System.Diagnostics;
using System.Windows;
using System.Windows.Interop;
public static class WordWindowOwner
{
public static void SetOwner(Window window)
{
try
{
var content = window.Content;
//if (content != null) { window.Content = null; } // optional remove window content if nessecary for perfomance isssues
IntPtr wordWindowHandle = IntPtr.Zero;
var activeWindow = Globals.ThisAddIn.Application.ActiveWindow;
wordWindowHandle = new IntPtr(activeWindow.Hwnd);
WindowInteropHelper helper = new WindowInteropHelper(window);
helper.Owner = wordWindowHandle;
//if (content != null) { window.Content = content; }
}
catch (Exception ex)
{
Debug.WriteLine($"Error in SetOwner: {ex.Message}");
}
}
}
@מד
האמת שחשבתי על הרעיון שלך, וכשאתה מעלה אותו שוב, אני קצת משתכנע שאולי אוכל ליישם גם אותו. עם זאת, לדעתי, הוא לבדו לא משרת את המטרה.
הסיבה היא שאם יש לך מסמך ארוך, ואינך זוכר בדיוק איזה טקסט צבוע ואיך, זה לא יהיה נוח לגלול כל פעם מחדש כדי לבצע חיפוש.
במיוחד כאשר מדובר בהחלפות, שבהן המטרה היא לעבוד במהירות בתוך חלונית ההחלפות על מספר רב של שינויים. ואידך זיל גמור.
@ek0583232948 כתב בתוכנה טובה לעריכת PDF חינמית:
ב-pdf-xchange יש אפשרות להדפיס את המסמך ולא לשמור, ואז יש לך את כל הכלים בצורה חינמית
2
אם מדפיסים זה שומר על שכבת הטקסט? או רק על התמונה?
@מד
לא הבנתי. אתה מתבדח או רציני הקריצה אומרת שאתה מתבדח?
@מד
הבה נחשוב יחד:
נניח אדם הגדיר עם הידאולוג שלך צבע מיוחד במסמך שלו איך כעת הוא יחפש את זה?
אם הוא משתמש בחיפוש של וורד הרי שזה יופיע לו שם בצבעים אחרונים.
אבל אם הוא משתמש בחיפוש רגקס שלי שהוא תוכנה בפני עצמה וורד לא נותן לי גישה לדיאולוג הזה בכל אופן לא בצורה ישירה.
אומנם אפשר לגשת לדיאולוג "גופן" בצורה תיכנותית אבל אח"כ להתשמש עם התוצאות זה קצת כאב ראש כי אז המשתמש עלול לחשוב שכל האפשרויות של החלונית גופן פתוחים לפניו בזמן שבחיפוש רגקס כשי לחסוך בזמן ובמהירות הוא ממוקד לעיצובים המצויים. אני אומר חיפוש רגקס למרות שעוד לא עשיתי את זה בתוכנה שלי כי זה בפיתוח כעת.
מקווה שהובנתי:
בקיצער הבעיה היתה תיכנותית. ולא בשימוש של וורד עצמו.
אולי כדאי להציג את הרשימה בתוך חלונית דיאולוג וחסל?
או שזה יפריע לנוחות של המשתמש?
זה לא יכביד על התוכנה לעקוב כל הזמן אחרי שינויים הרי כל פיפס במסמך נחשב שינוי?
אני מפתח תוסף חיפוש Regex עבור Word, שבו אני רוצה לאפשר למשתמש חיפוש מתקדם לפי צבעים במסמך.
מכיוון שאין אפשרות מובנית בוורד לשלוף את כל הצבעים במסמך (והרשימה המובנית של wdcolor ממש לא מכסה את כל הצבעים שיש.), אני שולף אותם ישירות מתוך ה-XML של המסמך באמצעות הקוד הבא:
public HashSet<string> ExtractColorsFromXml()
{
string xml = ActiveDocument.Content.WordOpenXML;
HashSet<string> colors = new HashSet<string>();
// Regex to match color values in w:color attributes (e.g., <w:color w:val="C45911"/>)
Regex colorRegex = new Regex(@"w:color\s+w:val=""([A-z0-9]+)""", RegexOptions.IgnoreCase);
foreach (Match match in colorRegex.Matches(xml))
{
colors.Add("#" + match.Groups[1].Value);
}
return colors;
}
כדי שהמשתמש יקבל תמיד את רשימת הצבעים העדכנית (למקרה שהצבעים במסמך השתנו), אני רוצה לוודא שהקומבו בוקס מתעדכן בכל פעם שהוא נפתח.
ניסיתי לעדכן את הנתונים כאשר הרשימה נפתחת כך:
private async void ColorDropDownOpened(object sender, EventArgs e)
{
if (sender is ComboBox comboBox)
comboBox.ItemsSource = new ColorsModel().Colors;
}
יש משהו שנתקע אם פותחים את הרשימה יותר מפעם אחת ברצף - אא"כ מחכים קצת.
אבל יש תקיעות אם פותחים את הרשימה כמה פעמים ברצף – אלא אם מחכים מעט.
שאלתי היא:
מהי הדרך האופטימלית לגרום לרשימה להתעדכן בכל פעם שהיא נפתחת, מבלי לגרום לתקיעות?
האם יש דרך לעשות זאת ישר דרך ה-viewmodel? והאם זה יעזור לתקיעות הנ"ל?
נ.ב. כמו"כ אשמח לדעת אם רגקס זה הדרך האופטלית לשלוף את הצבעים או שיש דרך מובנית יותר טובה ויותר מהירה להתעסק עם ה-xml.
@מד כתב בתווים כלליים בחיפוש בוורד: תופעה בעת שימוש במספר מופעים יחד עם טווח של תווים:
האם באמת הצלחת למצוא באופן זה מקדחה? או רק מקדדה ודומיו?
רק מקדדה ודומיו
@מד כתב בתווים כלליים בחיפוש בוורד: תופעה בעת שימוש במספר מופעים יחד עם טווח של תווים:
כנראה שהסוגריים גורמים שה-[א-ת] לא יחפש כי אם אות אחד בין א' לת'
השאלה נשאלת - למה?
@dovid
תודה על ההסבר הבנתי בערך. מישהו יכול בבקשה להרחיב קצת על מה ש@dovid כתב?
בעצם אני מתקשה להבין אם הוא כלול בביטוי הקודם אז למה זה גורם בעיה?
ניסיון שלי לבאר את חלק הסיפור שבהגדה כפשוטו - מבלי להצטרך להוספות חוץ מהטקסט. הביאור נכתב על פי דברי רבותינו הראשונים והאחרונים. וכפי שליקטתי בהגדה של פסח המפורשת תנו שבח.
הגדה של פסח כפשוטו.pdf
ניתקלתי בתופעה מעניינת בחיפוש של תווים כלליים בוורד, בעת שילוב סימן הכפילויות (מספר מופעים) יחד עם טווח של תווים.
אם אני מחפש את מק[א-ת]{2,}ה
אזי וורד נתקל בשגיאה.
אבל אם אני מוסיף סוגריים סביב הטווח מק([א-ת]){2,}ה
אזי הכל עובד כשורה.
אשמח אם מישהו יכול להסביר לי את פשר הדבר.
@dovid
עקב דבריך הנכוחים נסיתי לבדוק זאת ואכן לא ניתקלתי במגבלה. כנראה שהיה באג בקוד שלי שגרם לבעיות אינני יודע - אולי באמת קשור לזיכרון כלומר הרבה פעולות בבת אחת. כשיהיה לי יותר מידע אכתוב בלי נדר.
בכל אופן לבינתיים אני מסיק שאין כזו מגבלה.