Карты Google, встроенные в C # WebBrowser Control, не отображают кнопки увеличения / спутника - PullRequest
0 голосов
/ 24 мая 2018

Карты Google встроены в элемент управления System.Windows.Forms.WebBrowser.До недавнего времени это работало нормально.Но теперь кнопки типа карты (дорожная карта, спутник и т. Д.) И кнопки масштабирования больше не отображаются:

enter image description here

Открытие одного и того же HTML-файла непосредственно в IE11работает без проблем ( здесь ).

Я делаю следующее, чтобы заставить встроенный IE не использовать режим совместимости:

  • Установка режима эмуляции IE для приложения в HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION на 2af8.
  • с использованием <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> в <head> HTML.

Я использую .NET Framework 4.5.2.Небольшой пример проекта по воспроизведению проблемы: https://github.com/nharrer/gmap-dotnet-example

Вот часть HTML:

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />

    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Testpage</title>

    ....
</head>

<body>
    <div id="map"></div>
    <script>
        function initMap() {
            map = new google.maps.Map(document.getElementById('map'), {
                zoom: 4,
                center: { lat: 48.2081743, lng: 16.37381890000006 }
            });

            var marker = new google.maps.Marker({
                position: { lat: 48.2081743, lng: 16.37381890000006 },
                map: map,
                title: 'Mark1!'
            });

            var marker2 = new google.maps.Marker({
                position: { lat: 50.2081743, lng: 12.37381890000006 },
                map: map,
                title: 'Mark2!'
            });
        }
    </script>

    <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAR1yYbZk62bSF0-QWNfVm5FWE_Jpv-ExA&callback=initMap"></script>
</body>

</html>

А вот код c #, который устанавливает значения реестра совместимости и инициализируетэлемент управления WebBrowser:

public TestForm()
        {
            FixBrowserEmulation();

            InitializeComponent();

            bool designTime = LicenseManager.UsageMode == LicenseUsageMode.Designtime;
            if (!designTime) {
                mapBrowser.ScriptErrorsSuppressed = false;

                string docFile = Path.Combine(Application.StartupPath, "maptest.html");
                string documentText = File.ReadAllText(docFile);
                mapBrowser.DocumentText = documentText;
            }
        }

        // see: 
        // https://stackoverflow.com/questions/17922308/use-latest-version-of-internet-explorer-in-the-webbrowser-control
        // https://blog.malwarebytes.com/101/2016/01/a-brief-guide-to-feature_browser_emulation/
        private static void FixBrowserEmulation()
        {
            var appName = Process.GetCurrentProcess().ProcessName + ".exe";

            // 11000 (0x2AF8) - Internet Explorer 11. Webpages containing standards-based !DOCTYPE directives are displayed 
            // in IE11 edge mode. Default value for IE11.
            int? mode = 0x2AF8;

            try {
                const string regpath = @"SOFTWARE\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION";
                using (RegistryKey regkey = Registry.CurrentUser.CreateSubKey(regpath)) {
                    if (regkey == null) {
                        Debug.WriteLine("Error: Can not access: " + @"HKEY_CURRENT_USER\\" + regpath);
                        return;
                    }

                    var currentMode = regkey.GetValue(appName) as int?;
                    if (currentMode == mode) {
                        Debug.WriteLine("Info: FEATURE_BROWSER_EMULATION is correct.");
                        return;
                    }

                    regkey.SetValue(appName, mode, RegistryValueKind.DWord);

                    currentMode = regkey.GetValue(appName) as int?;
                    if (currentMode == mode) {
                        Debug.WriteLine("Info: FEATURE_BROWSER_EMULATION set to " + currentMode);
                    } else {
                        Debug.WriteLine("Info: FEATURE_BROWSER_EMULATION modification failed. Current value: " + currentMode);
                    }
                }
            } catch (Exception ex) {
                Debug.WriteLine(ex.Message);
            }
        }

1 Ответ

0 голосов
/ 29 августа 2018

Возможно, будет слишком поздно, но если кто-то наткнулся на упомянутую проблему, из-за которой исчезли элементы управления масштабированием и просмотром улиц, убедитесь, что для свойства AllowNavigation элемента управления WebBrowser установлено значение True.Так что в этом случае вы должны сделать

mapBrowser.AllowNavigation = true;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...