contextmenu в веб-браузере Windows Phone 7 - PullRequest
3 голосов
/ 29 января 2012

Я успешно добавил контекстное меню в свой веб-браузер с помощью этого кода JavaScript:

public void AttachContextMenu()
        {
            try
            {
                if ((App.Current as App).Browser.IsScriptEnabled)
                {
                    (App.Current as App).Browser.InvokeScript("execScript", "function FindParentLink(item) \r\n{\r\n\tif (!item.parentNode)\r\n\t\treturn null;\r\n\tif (item.tagName.toLowerCase() == 'a') \r\n\t{\r\n\t\treturn item;\r\n\t} \r\n\telse \r\n\t{\r\n\t\treturn FindParentLink(item.parentNode);\r\n\t}\r\n}\r\n\r\nfunction FindParentImage(item) \r\n{\r\n\tif (!item.parentNode)\r\n\t\treturn null;\r\n\tif (item.tagName.toLowerCase() == 'img') \r\n\t{\r\n\t\treturn item;\r\n\t} \r\n\telse \r\n\t{\r\n\t\treturn FindParentImage(item.parentNode);\r\n\t}\r\n}\r\n\r\nfunction HandleContextMenu() \r\n{\r\n\tvar linkItem = FindParentLink(event.srcElement);\r\n    var imageItem = FindParentImage(event.srcElement);\r\n    var notifyOutput = '';\r\n    if (linkItem != null) if (linkItem.href != null) notifyOutput += linkItem.href;\r\n    if (imageItem != null) if (imageItem.src != null) notifyOutput += imageItem.src;\r\n    if (notifyOutput != '')\r\n        window.external.notify(notifyOutput);\r\n    else\r\n\t\twindow.external.notify('NOTLINKIMG');\r\n}");
                    (App.Current as App).Browser.InvokeScript("execScript", "document.oncontextmenu = HandleContextMenu;");
                }
            }
            catch
            {
            }
        }

этот метод используется каждый раз, когда браузер перемещался. Итак, скрипт scripttify, который будет использоваться, когда пользователь удерживает ссылку:

 if (e.Value.ToString() != null && IsValidUri(e.Value.ToString()))
            {
                ContextMenu cm = new ContextMenu();
                MenuItem menuItem0 = new MenuItem() { Header = "X", Tag = e.Value };
                menuItem0.Click += new RoutedEventHandler(X_Click);
                MenuItem menuItem1 = new MenuItem() { Header = "Y", Tag = e.Value };
                menuItem1.Click += new RoutedEventHandler(Y_Click);
                MenuItem menuItem2 = new MenuItem() { Header = "Z", Tag = e.Value };
                menuItem2.Click += new RoutedEventHandler(Z_Click);

                    cm.Items.Add(menuItem0);
                    cm.Items.Add(menuItem1);
                    cm.Items.Add(menuItem2);


                ContextMenuService.SetContextMenu(Browser, cm);
                cm.IsZoomEnabled = false;
                cm.VerticalOffset = mouseClickPosition.Y;
                cm.IsOpen = true;
            }

Пока, я надеюсь, что все сделал правильно. теперь это работает случайным образом. почти 50% попыток вызывают ошибку, Visual Studio переходит к сине-белой рамке с именем «Источник недоступен» и выдает исключение NullReferenceException.

Где это должно быть решено? уже установлен блок try-catch вокруг лунки 2, без изменений: /

надеюсь, у вас есть идеи

здоровается roqstr

1 Ответ

1 голос
/ 10 марта 2012

не работает, но есть обходной путь:

AttachContextMenu ()

-> удержание ссылки приведет к появлению ссылки на метод scriptnotify.

создайте пользовательское контекстное меню и все в порядке.

...