webbrowser net control c# webview popup uwp

c# - net - wpf edge



¿Cómo puedo abrir ventanas emergentes en la misma WebView(no es una ventana nueva) en Windows UWP? (2)

Tengo un WebView en mi programa UWP que funciona bien EXCEPTO cuando hago clic en un botón que normalmente se abre en una nueva ventana (ventana emergente).

Cuando hago clic en un botón que normalmente se abre en una nueva ventana, solo quiero que se abra en el mismo WebView, pero se abre en mi navegador predeterminado. ¿Hay una configuración que pueda establecer para arreglar eso?

Actualizar:

He respondido a mi pregunta original. Agregué un controlador de eventos NewWindowRequested, abrí el

args.uri

en la misma webview y luego dijo

e.handled=true

Sin embargo, tengo un nuevo problema y es probable que solo sea con jeopardy.com. Estoy tratando de hacer un "Watson" que haga preguntas en Google, pero cuando abro la Prueba de práctica, nunca comienza.

Así que básicamente en mi WebView voy a https://www.jeopardy.com/be-a-contestant/practice-tests y hago clic en Tomar el examen de práctica. Cuando abre las nuevas ventanas, el temporizador nunca se inicia. Supongo que están tratando de evitar que las personas usen programas en sus preguntas. ¿Alguien tiene una solución?

También funciona en el borde para mí.

A diferencia de la vista web que se ve (lado derecho)

¿Crees que podría tener que ver con una función de javascript o tamaño de Windows?

ACTUALIZACIÓN2:

Para cualquier persona que quiera ayudar, aquí hay un repositorio de github:

https://github.com/SethKitchen/JeopardyWinner


Eché un vistazo a su problema. De hecho, necesita inicializar su segunda página, con algunos datos creados en la primera página. Si accede directamente a la segunda página ( https://www.jeopardy.com/be-a-contestant/practice-test-client ) con un navegador estándar, tendrá el mismo comportamiento que el que tiene en su aplicación UWP. .

Si inició la herramienta de depuración de su navegador (F12), verá que los scripts principales son:

Por lo tanto, he logrado iniciar el temporizador inyectando algo de contenido en la segunda página usando la consola del depurador (lo he probado con Firefox). Aquí están los pasos para ejecutar (copie / pegue todo en su consola y ejecútelo):

var s = document.createElement("script");s.type = "text/javascript";s.src = "https://www.jeopardy.com/Assets/jeopardy/easyxdm/exdm_helper.js";$("head").append(s); s.src = "https://www.jeopardy.com/Assets/jeopardy/js/main.js";$("head").append(s); s.src = "https://www.jeopardy.com/Assets/jeopardy/js/practice_test_launcher.js";$("head").append(s); backendUserCheck(); test_launcher.init();test_launcher.testWindow = window; $(''body'').append(''<div data - testfile = "/Assets/jeopardy/json/test_practice_2011.json" data - testid = "1" class="button launch_practice_test" data-testtype="adult">Take the practice test</div>''); var button = $(''.launch_practice_test'');test_launcher.testQuestionsFile = button.attr(''data-testfile'');test_launcher.testType = button.attr(''data-testtype'');test_launcher.testTitle = button.attr(''data-testtitle'');test_launcher.testID = button.attr(''data-testid''); testModule.parentRef=test_launcher; testModule.deleteLocalStorage(); testModule.checkLocalStorage(); testModule.getLocalStorage(); testModule.testID = testModule.parentRef.getTestID(); testModule.testType = testModule.parentRef.getTestType(); testModule.testFile = testModule.parentRef.getFile(); testModule.hardwareTest = testModule.parentRef.checkIfDryRun(); testModule.sendTestStart(); trace = function(){}; trace = { output : true, queue : [], push : function(data) { trace.queue.push(data); if(trace.output) { trace.post(); } return }, post : function() { $.each(trace.queue, function(i,arr) { trace.log(arr); }); trace.queue = []; return }, dump : function() { trace.post(); return }, log : function(data) { if (!window.console){ console = {log: function() {}} }; console.log(data); return } }; testModule.loadQuiz(); testModule.parentRef=test_launcher; testModule.startDate = testModule.parentRef.getStartDateInMS();

Este código de inicialización se extrae de los eventos onload o los métodos de inicio de los 2 scripts principales, como he mencionado anteriormente. El temporizador se ejecuta, pero las preguntas no aparecen después. Creo que carece de código de alertParent y setTestData ubicado en practice_test_client.js . Te dejo depurar la página web y encontrar los métodos necesarios para ejecutar.

Para que funcione en su UWP, debe insertar estos datos en su Vista web. Para esto, puede probar el método InvokeScriptAsync o descargar la página con HttpClient y agregar el comando de inicialización antes de cargar la página resultante en su webView:

string content = ""; using (HttpClient client = new HttpClient()) { content = await client.GetStringAsync(new Uri("https://www.jeopardy.com/be-a-contestant/practice-test-client")); }


Está desarrollando una aplicación UWP, por lo que las acciones de JavaScript dentro de una vista web que representan un sitio web no tienen el mismo comportamiento que si estuvieran renderizados en navegadores web. Tal vez debería desarrollar una aplicación con su propio HTML y scripts. Esto es así para evitar riesgos de seguridad.