2016-05-23 2 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. Но когда я могу установить адрес, почему не могу я установить ZoomLevel
Даже если я попробуйте поместить метод в FrameLoadEnd и измените ZoomLevel там, я получаю сообщение об ошибке только в другом потоке. Не должно ли это событие запускаться в одном потоке? Я не могу получить доступ к отправителю события внутри события? странно ...

Есть ли у кого-то идея, как я могу изменить ZoomLevel программно? Я должен изменить его при загрузке сайта, а затем кнопкой.

О, и кстати. Я использую МОФ-версию CefSharp 3.

+1

Вам нужно указать точную версию использования, например '49.0.0' или' 47.0.4'. Событие 'FrameLoadEnd' запускается в потоке' CEF', вам нужно отправить его в поток 'UI', чтобы получить доступ к свойству зависимости. Лучше назвать 'SetZoomLevel'. Помните, что «CefSharp» - это не волшебный черный ящик, источник там, просто убедитесь, что вы выбрали правильную ветку, соответствующую версии, используемой вами. – amaitland

+0

Я использую 49.0.0.0 и um ... hm ... yeah ... с простой 'private void MyBrowserOnFrameLoadEnd (отправитель объекта, FrameLoadEndEventArgs frameLoadEndEventArgs) { ChromiumWebBrowser browser = (ChromiumWebBrowser) отправитель; Dispatcher.Invoke (() => { 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

Ok, для всех, кто хочет знать, рабочий ответ здесь это:

О создании я добавил EventHandler

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 и т. Д.

+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. –

Смежные вопросы