首页 文章

CefSharp 3和SetZoomLevel

提问于
浏览
5

我在我的应用程序中以编程方式创建了许多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. 但是当我可以设置地址时,为什么我不能设置ZoomLevel?
即使我尝试在 FrameLoadEnd 中放置一个方法并在那里更改ZoomLevel,我只会得到一个错误,它在另一个线程上 . 不应该在同一个线程上触发该事件吗?我无法访问活动内的活动发件人?奇怪...

有人知道如何以编程方式更改ZoomLevel吗?我必须在加载网站时更改它,然后再按按钮更改它 .

哦,顺便说一下 . 我使用的是CefSharp 3的wpf版本 .

1 回答

  • 3

    好的,对于每个想知道这里工作答案的人来说:

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

    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中设置值等 .

相关问题