שאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית
-
שאלה: איך עושים בתוסף vsto לוורד ש taskpane יישאר תמיד במסמך הנוכחי
כלומר שם אני פוח מסמך חדש אז הוא יעבור אליו וכן אם אני עובר בין מסמך למסמך -
@dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
יש מקרה קיים כזו בpane של מקרוסופט?
סליחה לא הבנתי את השאלה
@dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
יש אירוע של איקטוב מסמך או שינוי מסמך אקטיבי?
כמדומני שכן
-
@dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
וכל פעם סוגר (יש כזו פקודה?)
על פניו לא כי בהשלמה המהירה של visualstdio רק מופיע לי פקודה של dispose
-
@dovid
צור תוסף vsto בvisualstudio
צור פקד usercontrol עם איזשהו כפתור או labelהזן קוד זה ליצירת החלונית צד
private UserControl1 taskPaneUserControl; private CustomTaskPane taskPane; private void ThisAddIn_Startup(object sender, System.EventArgs e) { taskPaneUserControl = new UserControl1(); taskPane = this.CustomTaskPanes.Add(taskPaneUserControl, "תורת אמת"); taskPane.Visible = true; taskPane.Width = 450; // Adjust the width as needed }
-
כדי לשחק עם אירוע פתיחת החלונות ייתכן שתצטרך להתשמש עם ספריית globals
Globals.ThisAddIn.Application.DocumentOpen += Application_DocumentOpen; Globals.ThisAddIn.Application.WindowActivate += Application_WindowActivate;
-
קודם הייתי צריך להתקין בVisual Studio את התמיכה של VSTO.
אח"כ היה לי פרוייקט יפה עם חלונית.
אחרי כמה דקות הסתבך לי (הייתה לי הודעה של התנגשות כל שהיא) ומאז בהרצה נפתח וורד אבל בלי החלונית... אז אני לא יכול לבדוק לבד.
אבל זה הכיוון שהתכוונתי:private void ThisAddIn_Startup(object sender, System.EventArgs e) { Application.DocumentChange += () => loadPanel(); loadPanel(); } void loadPanel() { if(taskPane != null) taskPane.Visible = false; taskPane = this.CustomTaskPanes.Add(new UserControl1(), "שלום עולם"); taskPane.Visible = true; taskPane.Width = 200; }
-
@dovid
עובד מצויין! תודה
אבל...
מה שהקוד עושה הוא בעצם יוצר taskpane חדש עבור כל מסמך שנפתח. אני צריך שהוא יעביר אותו ממסמך למסמך באותו מצב שהוא נמצא כעת.לגבי השגיאה שהזכרת לפעמים למחוק את תיקיית obj בתוך הrepo עוזר.
גם מומלץ להוסיף א תיקיית הrepo למיקומים מהימנים בוורד. -
לפי מה שכתוב פה
https://learn.microsoft.com/en-us/visualstudio/vsto/custom-task-panes?view=vs-2022&tabs=csharp#WordAndInfoPath
זה נראה שמה שאני רוצה זה אכן בלתי אפשרי -
@dovid
שמתי לב לבעיה בקוד שעשית
מה שקורה הוא שבעצם הקוד לא מסיר את המופע הקודם של ה taskpane אלא רק מסתיר אותו וכאשר אני חוזר אל המסמך הקודם שהייתי בו אז הוא יוצר taskpane חדש וחוזר חלילה.מה שצריך לעשות זה להוסיף בדיקה עם
|| taskPane.Window != Globals.ThisAddIn.Application.ActiveWindow
ולהוסיף
else { taskPane.Visible = true; }
שפושוט יחזיר את המופע המקורי במקרה שהוא כבר קיים במסמך זה ולא ייצור חדש שוב ושוב
נ.ב. שוב תודה רבה על כל העזרה הנפלאה
-
הסתדר לי התוסף (אני התקנתי את התוסף אחרי פבלוש והסרתו מאפליקציות פתרה את הבעיה).
במאמר שמה כתוב לעשות כמו שעשינו, הם לא מדברים על מקרה שרוצים שכל המצב יעבור למסמך השני,
אפשר לעשות זאת תכנותית, אבל באמת להעביר את הפקד כפי שהוא לא הצלחתי, זה מופיע שחור:private Microsoft.Office.Tools.CustomTaskPane taskPane; private UserControl1 control = new UserControl1(); private Word.Document lastDoc; private void ThisAddIn_Startup(object sender, System.EventArgs e) { Application.DocumentChange += () => loadPanel(); } void loadPanel() { if(Application.Documents.Count == 0 || lastDoc == Application.ActiveDocument) return; lastDoc = Application.ActiveDocument; if (taskPane != null) { control.Parent = null; this.CustomTaskPanes.Remove(taskPane); } taskPane = this.CustomTaskPanes.Add(control, "שלום עולם"); taskPane.Visible = true; taskPane.Width = 200; }
-
@pcinfogmach צודק, עובד!
private Microsoft.Office.Tools.CustomTaskPane taskPane; private UserControl1 control = new UserControl1(); private UserControlContainer container; private Word.Document lastDoc; private void ThisAddIn_Startup(object sender, System.EventArgs e) { Application.DocumentChange += () => loadPanel(); } void loadPanel() { if(Application.Documents.Count == 0 || lastDoc == Application.ActiveDocument) return; lastDoc = Application.ActiveDocument; if (taskPane != null) { container.Controls.Remove(control); this.CustomTaskPanes.Remove(taskPane); } container = new UserControlContainer(control); taskPane = this.CustomTaskPanes.Add(container, "שלום עולם"); taskPane.Visible = true; taskPane.Width = 200; } public class UserControlContainer : UserControl { public UserControlContainer(UserControl1 control) { Controls.Add(control); control.Dock = DockStyle.Fill; } }
-
@dovid
פידבק שקיבלתי מחברזה יפה מאוד, כדאי לך לקחת בחשבון כמה פרטים חשובים
א'. אי סגירת החלונות צד ורק הסתרתם, יש לה מחיר במעבד ובראמ.
ב'. הוספת התיבה בעת פתיחת מסמך חדש, תגרום להאטה של פתיחת המסמך החדש, יש לשקול לעשות את זה רק זמן אחר פתיחת המסמך החדש. -
א. אנו לא רק מסתירים, אנחנו משתמשים עם CustomTaskPanes.Remove שתפקידה לנקות משאבים.
ב. אני לא מבין מה הקשר לנושא פה. אני לא מכיר VSTO, אין לי מושג מה גורם לפתיחה בהתחלה של החלונית ולפי מה אפשר לדחות זאת. אני השתמשתי בקוד שנתת לי וסה"כ עניתי איך לגרום שהפעלת מסמך אחר תציג את אותה חלונית.נ.ב. אם תצליח לגרום לחבר שלך להשתתף פה בדיונים אודה לך מאוד!
-
@dovid כתב בשאלה: איך עושים בתוסף vsto לוורד שtaskpane יישאר תמיד בחלונית האקטיבית:
נ.ב. אם תצליח לגרום לחבר שלך להשתתף פה בדיונים אודה לך מאוד!
נסיתי בעבר אנסה שוב.
ושוב תודה על הכל. פשוט אין מילים בפי. -
@dovid
ניתקלתי בבעיה בקוד הנוכחי - כאשר המשתמש סוגר את החלונית אז זה לא מעיל לו לסגור אותה לגמרי כי זה קופץ לו בחזרה ברגע שהוא מחליף תצוגה ממסמך למסמך
חשבתי לעשות משתנה Bool שיקלוט את זה אבל אולי יש דרך יותר טובה?
כמו"כ לא הצלחתי לקלוט את הלחיצה על כפתור הסגירה. (שים לב כפתור הסגירה אינו סוגר רק מסתיר אז לתפוס את ההסתרה אולי זה אופציה השאלה אם זה עלול לגרום לבעיה שלא חשבתי עליה)עריכה:
ניסיתי את הרעיון עם הbool שיקלוט את אירוע ההסתרה וניתקלתי בבעיה:
כאשר המשתמש סוגר מסמך אחד (דהיינו סוגר מסמך ולא את התוסף) אז החלונית נסגרת בכל החלונות
להוסיף משהו שיטפל באירוע סגירת המסמך ג"כ משתבש לי כי אז זה סוגר בכל החלוניות וכאשר פותחים מסמך חדש זה חוזר בכל חלוניות בקיצור בלאגן גדול