CefSharp 3 和 SetZoomLevel
CefSharp 3 and SetZoomLevel
我正在我的应用程序中以编程方式创建许多 ChromiumWebBrowser 实例。一段时间后,我设置了浏览器的可见性和地址。我也想改变缩放级别。但是每当我尝试以正常方式更改它时(比如使用简单的
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 版本。
好的,对于想知道有效答案的每个人来说,它是:
创建时我添加了一个事件处理程序
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.
}
以及最后的答案dispatching/tasking等等
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 等中设置值。
它对我不起作用,但我为其他有相同问题的人提供了修复程序。
我将为这个修复创建一个新主题,这样可以节省时间。
这花了我 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);
}
我对浏览器进行了子类化并覆盖了 {{OnIsBrowserInitializedChanged}},我相信订阅也可以。
我正在我的应用程序中以编程方式创建许多 ChromiumWebBrowser 实例。一段时间后,我设置了浏览器的可见性和地址。我也想改变缩放级别。但是每当我尝试以正常方式更改它时(比如使用简单的
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 版本。
好的,对于想知道有效答案的每个人来说,它是:
创建时我添加了一个事件处理程序
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.
}
以及最后的答案dispatching/tasking等等
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 等中设置值。
它对我不起作用,但我为其他有相同问题的人提供了修复程序。 我将为这个修复创建一个新主题,这样可以节省时间。 这花了我 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);
}
我对浏览器进行了子类化并覆盖了 {{OnIsBrowserInitializedChanged}},我相信订阅也可以。