Встроенный фреймворк Chromium (автоматическая подгонка под размер winform) - PullRequest
0 голосов
/ 07 мая 2020

У меня проблема со встроенным фреймворком Cefsharp Chrome, поэтому у меня есть приложение C# WinForm с фиксированным размером 700x400. Проблема в том, что когда я открываю веб-сайт, он никогда не реагирует на заданный размер. Возьмем приведенный ниже пример веб-сайта Google:

Пользовательское эмулируемое устройство (700x400): Рабочий стол

Как вы видите на картинке, на оси X есть полоса прокрутки с действительно раздражающий пользовательский интерфейс, мне нужно сделать его отзывчивым к размеру формы, например, когда вы используете эмуляцию устройства в своем Google Chrome DevTools.

Пользовательское эмулируемое устройство (700x400): Mobile

Что касается решений, я подумал об использовании функции "SetZoomLevel", чтобы веб-сайт идеально соответствовал размеру формы.

public Stackoverflow(){
    public void Zoom(){
        var scrollWidth = Convert.ToDouble(Evaluate("Math.max(document.body.scrollWidth, document.documentElement.scrollWidth);"));
        var clientWidth = Convert.ToDouble(Evaluate("Math.min(document.body.clientWidth, document.documentElement.clientWidth);"));
        var offsetWidth = Convert.ToInt32 (Evaluate("var outer = document.createElement('div'); outer.style.visibility = 'hidden'; outer.style.overflow = 'scroll'; outer.style.msOverflowStyle = 'scrollbar'; document.body.appendChild(outer); var inner = document.createElement('div'); outer.appendChild(inner); var scrollbarWidth = (outer.offsetWidth - inner.offsetWidth); outer.parentNode.removeChild(outer); scrollbarWidth;"));
        if (clientWidth < scrollWidth){
            double diff = Convert.ToDouble(Form.Width - offsetWidth) / scrollWidth; // 1.2 ^ zoom = scale (%)
            double zoom = Math.Round(Math.Log(diff) / Math.Log(1.2), 5);
            Chromium.SetZoomLevel(zoom);
        }
    }
    public object Evaluate(string script){
        Task<JavascriptResponse> task = Chromium.GetFocusedFrame().EvaluateScriptAsync(script);
        task.Wait();
        JavascriptResponse response = task.Result;
        return response.Success ? (response.Result ?? "") : response.Message;
    }
}

Проблема в том, что код не может выполняться, пока страница не загрузится полностью. В результате между двумя картинками выше есть задержка. Меня это раздражает !!!!!

Я знаю, что могу использовать пользовательский агент, чтобы изменить отклик веб-сайта на мобильный режим, но мне не нравится тот факт, что сервер предоставит мне мобильный версия веб-сайта.

CefSettings Settings = new CefSettings();
Settings.UserAgent = "Mozilla/5.0 (Android 4.4; Mobile; rv:46.0) Gecko/46.0 Firefox/46.0";
Cef.Initialize(Settings);

Есть идеи, пожалуйста?

Операционная система: Windows x64.

Программное обеспечение: Visual Studio Community 2019.

Шаблон: WinForm.

Язык: C#.

...