CefSharp 3 和 SetZoomLevel

Posted

技术标签:

【中文标题】CefSharp 3 和 SetZoomLevel【英文标题】:CefSharp 3 and SetZoomLevel 【发布时间】:2016-09-20 05:04:04 【问题描述】:

我正在我的应用程序中以编程方式创建许多 ChromiumWebBrowser-Instances。一段时间后,我为浏览器设置了可见性和地址。我也想改变缩放级别。但是每当我尝试以正常方式更改它时(例如使用简单的

browser.ZoomLevel = (Convert.ToDouble(browser.Tag) - 100) / 25.0;

我只得到一个错误:IBrowser instance is null. Browser has likely not finished initializing or is in the process of disposing. 但是当我可以设置地址时,为什么我不能设置缩放级别? 即使我尝试在FrameLoadEnd 中放置一个方法并在那里更改 ZoomLevel,我也只会收到一个错误,它在另一个线程上。事件不应该在同一个线程上触发吗?我无法在事件中访问事件的发送者?奇怪...有人知道如何以编程方式更改 ZoomLevel 吗?我必须在加载网站时更改它,然后通过按钮进行更改。 哦,顺便说一句。我正在使用 CefSharp 3 的 wpf 版本。

【问题讨论】:

您需要指定您使用的确切版本,例如49.0.047.0.4FrameLoadEnd 事件在`CEF` 线程上触发,您必须将它分派到UI 线程才能访问依赖属性。最好致电SetZoomLevel。请记住CefSharp 不是什么神奇的黑匣子,源代码就在那里,只要确保选择与您使用的版本相对应的正确分支。 我正在使用 49.0.0.0 和嗯...嗯...是的...与一个简单的` private void MyBrowserOnFrameLoadEnd(object sender, FrameLoadEndEventArgs frameLoadEndEventArgs) ChromiumWebBrowser browser = (ChromiumWebBrowser) sender; Dispatcher.Invoke(() => browser.ZoomLevel = (Convert.ToDouble(browser.Tag) - 100) / 25.0; ); ` 它工作正常 如果您需要提前设置缩放级别,那么您可能需要扩展 ChromiumWebBrowser 并覆盖 OnIsBrowserInitializedChanged github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Wpf/… 【参考方案1】:

好的,对于所有想知道有效答案的人来说:

在创建时我添加了一个事件处理程序

myBrowser.FrameLoadEnd += MyBrowserOnFrameLoadEnd;

看起来像这样

private void MyBrowserOnFrameLoadEnd(object sender, FrameLoadEndEventArgs frameLoadEndEventArgs)

    ChromiumWebBrowser browser = (ChromiumWebBrowser) sender;
    Dispatcher.Invoke(() =>
    
        ZoomLevelTextBox.Text = ((Convert.ToDouble(browser.Tag) - 100) / 25.0).ToString(CultureInfo.CurrentCulture);
        browser.SetZoomLevel((Convert.ToDouble(browser.Tag) - 100) / 25.0);
    );

以后你可以用两个按钮来改变它

private void IncreaseZoomOnPreview_OnClick(object sender, RoutedEventArgs e)

    if (_selectedPreview < 0 || _previewItems[_selectedPreview] == null)
        return;
    ChangeZoom(0.5); //You could also use 0.1 or 1.0, as you like and in the decrease button you use -0.5, etc.

以及调度/任务等的最终答案

private void ChangeZoom(double change)

    PreviewItem previewItem = _previewItems[_selectedPreview];
    ChromiumWebBrowser browser = new ChromiumWebBrowser();
    foreach (object child in ((Canvas)previewItem.PreviewBorder.Child).Children)
    
        browser = child as ChromiumWebBrowser;
        if (browser != null)
            break;
    
    Task<double> task = browser.GetZoomLevelAsync();
    task.ContinueWith(previous =>
    
        if (previous.IsCompleted)
        
            double currentLevel = previous.Result;
            browser.SetZoomLevel(currentLevel + change);
        
        else
        
            throw new InvalidOperationException("Unexpected failure of calling CEF->GetZoomLevelAsync", previous.Exception);
        
    , TaskContinuationOptions.ExecuteSynchronously);
    ZoomLevelTextBox.Text = (Convert.ToDouble(ZoomLevelTextBox.Text) + change).ToString(CultureInfo.CurrentCulture);

最大值是 -10 到 10 的值。因此,您也应该在单击时请求该值,或者在 ListBox 或 ComboBox 等中设置值。

【讨论】:

WPF 版本具有内置命令,您可以绑定这些命令来增加、减少和重置缩放。 github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Wpf/…github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Wpf/… 你的previous.IsComplete检查也不正确,应该是if (previous.Status == TaskStatus.RanToCompletion) 你是对的,但我放弃了使用缩放的整个想法,而是使用了渲染转换。 只是为遇到此答案的其他人提供替代方案。【参考方案2】:

我对浏览器进行了子类化并覆盖了 OnIsBrowserInitializedChanged,我确信只是订阅也可以。

【讨论】:

【参考方案3】:

它对我不起作用,但我为其他有同样问题的人提供了解决方案。 我将为此修复创建一个新主题,这将节省时间。 这花了我 5 个小时才弄清楚。 IsLoaded 检查是解决办法...

public async void Executejavascript(string script)
    
        if (browser != null)
            if (browser.CanExecuteJavascriptInMainFrame)
            
                System.Windows.Forms.MessageBox.Show(browser.IsLoaded.ToString());
                if(browser.IsLoaded == true)
                browser.ExecuteScriptAsync(script);
            
                await Task.Delay(5000);
    

【讨论】:

没有解决问题中详述的问题,仅在浏览器加载时缩放根本无法正常工作。错误可能是相同的,您的答案是关于执行完全不同的 JavaScript。

以上是关于CefSharp 3 和 SetZoomLevel的主要内容,如果未能解决你的问题,请参考以下文章

CefSharp 3 在运行时设置代理

在winform中使用cefsharp.winform嵌入浏览器(含视频教程)

CefSharp使用记录

CefSharp应用——程序输出

cefsharp.hxbrowsersub系统错误

cefsharp停止request