Search code examples
c#.netwebwebviewmaui

How to prevent webView from opening new tab on middle mouse button click


I use Web View in MAUI in my .net application. When user click on the link with middle mouse button (or regular click with shift pressed) a new window is pop up.

And this is want I want to prevent. I need my custom action on this event.

What I tried :

  • Use js to set events on page
  • Subscribe to MAUI events like OnWindowCreated

Edit : I Tried to catch middle mouse lick with in low level style with OnPlatformMessage in ConfigureLifecycleEvents but failed


Solution

  • I solved this Issues like this :

    Create custom WebView like that:

    #if WINDOWS
        public class CustomWebView : WebView
        {
        ... code
        }
    #else
        public class CustomWebView : WebView
        {
        }
    #endif
    

    Than I put this methods inside to catch tapped event :

        protected override void OnHandlerChanged()
        {
            base.OnHandlerChanged();
    
            // Check if the handler is available and it is a specific platform handler
            if (Handler?.PlatformView is WebView2 webView)
            {
                webView.Tapped += WebView_Tapped;
                webView.NavigationStarting += WebView_NavigationStarting; ;
            }
        }
    

    In tapped I get CoreWebView2 and add handler on newWindowRequested event like this :

        private void WebView_Tapped(object sender, Microsoft.UI.Xaml.Input.TappedRoutedEventArgs e)
        {
            WebView2 senderWebView = sender as WebView2;
    
            // Unsubscribe the event handler if it's already subscribed
            senderWebView.CoreWebView2.NewWindowRequested -= CoreWebView2_NewWindowRequested;
    
            // sucbscribe
            senderWebView.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
        }
    

    Than I handle new window requested to disallow new window to pop Up by marking requested as handled and raise event to handle this action with my logic instead of aperaing new WebView window :

        private void CoreWebView2_NewWindowRequested(Microsoft.Web.WebView2.Core.CoreWebView2 sender, Microsoft.Web.WebView2.Core.CoreWebView2NewWindowRequestedEventArgs args)
        {
            // Create an event argument object to pass data to the event handler
            var eventArgs = args.Uri;
            // Raise the custom event
            OnNewWindowRequested(eventArgs);
    
            args.Handled = true;
            return;
        }