שאלות ב- Cef sharp
-
אני מנסה ליצור אפליקציה קטנה עם cef sharp (דפדפן כרום) בwinForm.
באתר שאני מציג יש קישור שפותח כרטיסיה חדשה. איך אפשר למנוע מהמשתמש לפתוח כרטיסיה חדשה. ובמקום זה אני אולי אצור לו page חדש ב tabControl.שאלה נוספת: אני רוצה למנוע ממנו לעבור לאתר אחר (שיש קישור שלו באתר שאני מציג). איך לעשות זאת?
תודה. -
@dovid וכל השאר, אני צריך פה את עזרתם.
עשיתי פרוייקט קטן ב Winform של דפדפן.
השתמשתי ב CefSharp. הכל טוב ויפה.
אבל איפה שיש לינק שפותח חלון חדש (קישור עם "blank" ב target) אני רוצה ללכוד את האירוע הזה ובמקום שייפתח חלון חדש, להוסיף כרטיסייה ושם לפתוח את החלון. כמו בדפדפן "אמיתי".
ב WinForm זה עובד מעולה.
ל ChromiumWebBrowser יש פרופרטי שנקרא LifeSpanHandler.
שם אני יכול להיצמד לאירוע שנקרא : "OnBeforePopup".
הבעיה היא שה ChromiumWebBrowser רץ כנראה בתהליך נפרד, לכן הייתי צריך להשתמש ב Invoke. והכל עובד יופי.
הבעיה היא ב WPF. ניסיתי לעשות שם את אותו המהלך וזה נופל בלי להשאיר שגיאה.... אני לא מבין בWPF, וגם לא רוצה להיכנס לזה (לפחות לא בזמן הקרוב) אבל נראה שהלוגיקה אמורה להיות בערך כמו ה WinForm.
אנא עזרתכם! -
הבנתי את הבעיה שלך.
המקביל של Post של WinForms בWPF זה Dispatcher.Invoke.
כיון שהבנתי רק אחרי שעשיתי דמו אז אני מצרף את הקוד:public partial class MainWindow : Window { MyLifeSpanHandler myHandler; public MainWindow() { myHandler = new MyLifeSpanHandler(); myHandler.OpenNewPage += (s) => Dispatcher.Invoke(() => OpenNewTab(s)); InitializeComponent(); OpenNewTab("http://netfree.link/common-sites"); } void OpenNewTab(string address) { var tabItem = new TabItem(); var browser = new ChromiumWebBrowser(); browser.LifeSpanHandler = myHandler; browser.Address = address; browser.TitleChanged += (s, e) => tabItem.Header = e.NewValue; tabItem.Content = browser; tabControl1.Items.Add(tabItem); } } public class MyLifeSpanHandler : ILifeSpanHandler { public event Action<string> OpenNewPage; public bool DoClose(IWebBrowser browserControl, IBrowser browser) => true; public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser){} public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser){} public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser) { newBrowser = new ChromiumWebBrowser(); OpenNewPage?.Invoke(targetUrl); return true; } }
-
תודה. עוד מעט אבדוק.
ניסיתי בתחילה Dispatcher.Invoke ולא עזר.
(
@dovid אני לא רוצה WPF כי זה מסובך טילים (?) בשבילי.
אני יודע את העיקרון של XAML. אבל מפה זה רק מתחיל. אני גם חושב מה זה כבר ייתן לי. רק פיתוח בסביבת windows.
בעיקרון די נמאס לי מ C#, אני מעדיף להשקיע את המאמצים בפיתוח WEB. כולל electron שייתן לי פתרון לdesktop.
עכשיו אני די רק בתחזוקה של פרוייקטים קיימים בC# winForm.
) -
-
@dovid אמר בשאלות ב- Cef sharp:
תראה זה לא פונקציה כ"כ קטנה, אתה בהינף יד רוצה לממש ממשק טאבים, ולהאזין לאירוע פנימי של כרומיום, זה לא מובן מאליו.
תוצאות מייד, אני פחות או יותר באותו רעיון...
ממה שאני רואה אתה בסדר גמור.אתה כנראה לא יודע כמה זמן אני בתחום שזה נראה לך משהו גדול.