Skip to content

Commit 0efd241

Browse files
committed
WinForms - Allow creation of custom ChromiumHostControl instance
- Add new CreatePopupChromiumHostControl delegate which can be passed to LifeSpanHandler.Create to create a new ChromiumHostControl instance. You can create a class that inherits from ChromiumHostControl and add additional functionality. LifeSpanHandler .Create(() => { return new ChromiumHostControl { Dock = DockStyle.Fill }; })
1 parent 571a1db commit 0efd241

File tree

2 files changed

+35
-8
lines changed

2 files changed

+35
-8
lines changed

CefSharp.WinForms/Handler/LifeSpanHandler.cs

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ namespace CefSharp.WinForms.Handler
3737
/// <param name="browser">browser</param>
3838
public delegate void OnPopupDestroyedDelegate(ChromiumHostControl control, IBrowser browser);
3939

40+
/// <summary>
41+
/// Called to create a new instance of <see cref="ChromiumHostControl"/>. Allows creation of a derived
42+
/// implementation of <see cref="ChromiumHostControl"/>.
43+
/// </summary>
44+
/// <returns>A custom instance of <see cref="ChromiumHostControl"/>.</returns>
45+
public delegate ChromiumHostControl CreatePopupChromiumHostControl();
46+
4047
/// <summary>
4148
/// A WinForms Specific <see cref="ILifeSpanHandler"/> implementation that simplifies
4249
/// the process of hosting a Popup as a Control/Tab.
@@ -49,7 +56,13 @@ public class LifeSpanHandler : CefSharp.Handler.LifeSpanHandler
4956
private OnPopupDestroyedDelegate onPopupDestroyed;
5057
private OnPopupBrowserCreatedDelegate onPopupBrowserCreated;
5158
private OnPopupCreatedDelegate onPopupCreated;
52-
59+
private CreatePopupChromiumHostControl chromiumHostControlCreatedDelegate;
60+
61+
public LifeSpanHandler(CreatePopupChromiumHostControl chromiumHostControlCreatedDelegate)
62+
{
63+
this.chromiumHostControlCreatedDelegate = chromiumHostControlCreatedDelegate;
64+
}
65+
5366
/// <inheritdoc/>
5467
protected override bool DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
5568
{
@@ -168,10 +181,15 @@ protected override bool OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser b
168181
//We need to execute sync here so IWindowInfo.SetAsChild is called before we return false;
169182
webBrowser.InvokeSyncOnUiThreadIfRequired(new Action(() =>
170183
{
171-
var control = new ChromiumHostControl
184+
ChromiumHostControl control = chromiumHostControlCreatedDelegate?.Invoke();
185+
186+
if (control == null)
172187
{
173-
Dock = DockStyle.Fill
174-
};
188+
control = new ChromiumHostControl
189+
{
190+
Dock = DockStyle.Fill
191+
};
192+
}
175193
control.CreateControl();
176194

177195
onPopupCreated?.Invoke(control, targetUrl);
@@ -238,10 +256,14 @@ public LifeSpanHandler OnPopupDestroyed(OnPopupDestroyedDelegate onPopupDestroye
238256
/// of implementing directly you will need to inherit from <see cref="CefSharp.WinForms.Handler.LoadHandler"/>.
239257
/// As it provides base functionality required to make <see cref="ChromiumHostControl"/> events work correctly.
240258
/// </summary>
241-
/// <returns>LifeSpanHandlerBuilder</returns>
242-
public static LifeSpanHandlerBuilder Create()
259+
/// <returns>
260+
/// A <see cref="LifeSpanHandlerBuilder"/> which can be used to fluently create an <see cref="ILifeSpanHandler"/>.
261+
/// Call <see cref="LifeSpanHandlerBuilder.Build"/> to create the actual instance after you have call
262+
/// <see cref="LifeSpanHandlerBuilder.OnPopupCreated(OnPopupCreatedDelegate)"/> etc.
263+
/// </returns>
264+
public static LifeSpanHandlerBuilder Create(CreatePopupChromiumHostControl chromiumHostControlCreatedDelegate = null)
243265
{
244-
return new LifeSpanHandlerBuilder();
266+
return new LifeSpanHandlerBuilder(chromiumHostControlCreatedDelegate);
245267
}
246268
}
247269
}

CefSharp.WinForms/Handler/LifeSpanHandlerBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ namespace CefSharp.WinForms.Handler
99
/// </summary>
1010
public class LifeSpanHandlerBuilder
1111
{
12-
private readonly LifeSpanHandler handler = new LifeSpanHandler();
12+
private readonly LifeSpanHandler handler;
13+
14+
public LifeSpanHandlerBuilder(CreatePopupChromiumHostControl chromiumHostControlCreatedDelegate)
15+
{
16+
handler = new LifeSpanHandler(chromiumHostControlCreatedDelegate);
17+
}
1318

1419
/// <summary>
1520
/// The <see cref="OnPopupCreatedDelegate"/> will be called when the<see cref="ChromiumHostControl"/> has been

0 commit comments

Comments
 (0)