2016-05-23 126 views
3



我在應用程序中以編程方式創建了許多ChromiumWebBrowser-Instances。過了一段時間後,我爲瀏覽器設置了可見性和地址。我也想改變縮放級別。但每當我試圖改變它以正常的方式(如用一個簡單的CefSharp 3和SetZoomLevel

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?我必須在網站的加載和後來的按鈕上更改。

哦,順便說一句。我現在用的WPF的版本CefSharp 3.

+1

您需要指定您使用的確切版本,例如'49.0.0'或'47.0.4'。在''CEF'線程上觸發'FrameLoadEnd'事件,你必須將它分派到'UI'線程來訪問一個依賴屬性。最好調用'SetZoomLevel'。記住'CefSharp'不是一些神奇的黑盒子,源代碼就在那裏,只要確保你選擇了與你使用的版本相對應的正確分支。 – amaitland

+0

我正在使用49.0.0.0和嗯...嗯...是啊...用一個簡單的'私人無效MyBrowserOnFrameLoadEnd(對象發件人,FrameLoadEndArrayArrow frameLoadEndEventArgs) { ChromiumWebBrowser browser =(ChromiumWebBrowser)sender; (()=> { browser.ZoomLevel =(Convert.ToDouble(browser.Tag) - 100)/ 25.0; }); }'工作正常 –

+0

如果您需要提前設置縮放級別,那麼您可能必須擴展'ChromiumWebBrowser'並重寫'OnIsBrowserInitializedChanged' https://github.com/cefsharp/CefSharp/blob/cefsharp/49/ CefSharp.Wpf/ChromiumWebBrowser.cs#L569 – amaitland

回答

2

好了,大家誰想要知道這裏的工作答案是:

在創造我添加了一個事件處理程序

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的值,所以你應該問的是一個點擊也或者在設置的值列表框或組合框等。

+0

「WPF」版本內置了一些命令,您可以將它們綁定以增加,減少和重置縮放。 https://github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Wpf/ChromiumWebBrowser.cs#L75 https://github.com/cefsharp/CefSharp/blob/cefsharp/49/CefSharp.Wpf/ChromiumWebBrowser .cs#L657 – amaitland

+0

您的'previous.IsComplete'檢查也不正確,應該是'if(previous.Status == TaskStatus.RanToCompletion)'。 – amaitland

+1

你說得對,但我放棄了使用縮放的全部想法,而是使用了rendertransform。 –