TL; DR - есть ли способ загрузить страницы в CefSharp до того, как элемент управления получит фокус? Несмотря на то, что я указал URL, он начнет загружаться только тогда, когда элемент управления окажется в фокусе.
Полная версия:
У меня есть приложение WPF, в котором есть Tabcontrol с пятью вкладками, и в двух из этих вкладок я хочу загрузить две веб-страницы, которые часто используются как часть использования приложения. Оба эти сайта загружают свои соответствующие страницы входа, а затем у меня есть команды Javascript, чтобы выполнить вход через ExecuteJavaScriptAsync ().
Чтобы сделать все это, я создал Usercontrol, размещающий элемент управления ChromiumWebBrowser, и он все прекрасно работает за исключением , что страницы будут загружаться только тогда, когда я действительно нажимаю на каждую из вкладок веб-браузера - другими словами, это Кажется, загрузка произойдет только тогда, когда она получит явный фокус.
Мне нужно, чтобы CefSharp просто загружал страницы в фоновом режиме, чтобы когда пользователю нужно было перейти на вкладки веб-страниц, сайты уже загружены и пользователь вошел в систему.
Раньше я использовал GeckoBrowser, и он загружал страницы в фоновом режиме так, как мне нужно, но я больше не могу использовать этот элемент управления, поскольку у него есть неуловимая внутренняя ошибка, которая продолжает сбой моего приложения. Я также не могу использовать WebView или более старый WebControl, так как не могу заставить работать команды Javascript для входа на каждый сайт.
Я добавил XAML и код ниже (хотя я не думаю, что они действительно необходимы), но мой вопрос очень прост - как мне заставить страницы загружаться в CefSharp до того, как элемент управления окажется в фокусе?
Вот мои вкладки в моем MainWindow.xaml ...
<TabItem>
<TabItem.Header>
<TextBlock Text="Rebrickable" Style="{StaticResource HeaderTextBlockStyle}"/>
</TabItem.Header>
<Grid Name="grdRebrickable" Background="AliceBlue" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
</Grid>
</TabItem>
<TabItem>
<TabItem.Header>
<TextBlock Text="BrickLink" Style="{StaticResource HeaderTextBlockStyle}"/>
</TabItem.Header>
<Grid Name="grdBrickLink" Background="AliceBlue" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
</Grid>
</TabItem>
... и в коде у меня есть это, которое вызывается при запуске MainWindow:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//Instantiate our browser controls, add them to each of the tab items and load their home pages.
PrepareBrowserControls();
}
private void PrepareBrowserControls()
{
csBrickLink = new CefSharpBrowser(BrowserType.BrickLink, AppGlobals.BrickLinkBaseURL);
grdBrickLink.Children.Add(csBrickLink);
csBrickLink.LoadURL(AppGlobals.BrickLinkBaseURL);
csRebrickable = new CefSharpBrowser(BrowserType.Rebrickable, AppGlobals.RebrickableBaseURL);
grdRebrickable.Children.Add(csRebrickable);
csRebrickable.LoadURL(AppGlobals.RebrickableBaseURL);
}
XAML для CefSharpBrowser UserControl:
<UserControl x:Class="MOCManager.Controls.CefSharpBrowser"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:cef="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
xmlns:local="clr-namespace:MOCManager.Controls"
mc:Ignorable="d" >
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<!-- other XAML here left out for brevity -->
<cef:ChromiumWebBrowser x:Name="cefBrowser"
FrameLoadEnd="cefBrowser_FrameLoadEnd" />
</Grid>
</UserControl>
И основной код для UserControl (некоторые опущены для краткости):
public partial class CefSharpBrowser : UserControl
{
//enumeration of site types to load
private BrowserType _browserType;
//Login page URL of the sire to load
private string _baseURL;
public CefSharpBrowser(BrowserType browserType, string baseUrl)
{
InitializeComponent();
this._browserType = browserType;
this._baseURL = baseUrl;
}
public void LoadURL(string url)
{
if (!string.IsNullOrEmpty(url) && url.ToLower().StartsWith("http"))
cefBrowser.Address = url;
else
MessageBox.Show("Invalid or missing URL!");
}
private void cefBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
{
if (e.Frame.IsMain)
{
Application.Current.Dispatcher.Invoke(new Action(delegate
{
txtURL.Text = e.Url;
txtStatus.Text = "Page loaded";
}));
//Do automated logins depending on the site
if (e.Url.Contains("login/?next="))
{
SetStatus("Logging into Rebrickable...");
cefBrowser.GetMainFrame().ExecuteJavaScriptAsync("$('input[name=username]').val(\"joebloggs\")");
cefBrowser.GetMainFrame().ExecuteJavaScriptAsync("$('input[name=password]').val(\"abc123\")");
cefBrowser.GetMainFrame().ExecuteJavaScriptAsync("$('button[type=\"submit\"]').click();");
}
else
{
if (e.Url.Contains("login.page"))
{
SetStatus("Logging into BrickLink...");
cefBrowser.GetMainFrame().ExecuteJavaScriptAsync("$('input[name=frmUsername]').val(\"joebloggs\")");
cefBrowser.GetMainFrame().ExecuteJavaScriptAsync("$('input[name=frmPassword]').val(\"abc123\")");
cefBrowser.GetMainFrame().ExecuteJavaScriptAsync("$('input[name=frmStayLoggedIn]').checked=true");
cefBrowser.GetMainFrame().ExecuteJavaScriptAsync("$('button[type=\"submit\"]').click();");
}
}
}
}
}