Загрузите страницу в CefSharp, прежде чем она будет в фокусе - PullRequest
0 голосов
/ 14 апреля 2019

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();");
                    }
                }
            }
        }
   }
...