捕获鼠标单击事件

时间:2019-02-07 14:34:31

标签: c# wpf cefsharp

我确实用谷歌搜索了一下,但没有找到任何有帮助的东西。 我正在使用C#WPF cefsharp.wpf cefSharp:ChromiumWebBrowser

我想要做的就是,当用户单击网页上的任何内容时,我想捕捉c#中的鼠标单击事件。原因是我在页面上运行了javascript,该javascript注册了单击的内容并传回了一个值。因此,我需要从javascript中获取该值。一切都已设置。我只是无法让C#注册浏览器已被单击。 C#不需要知道在页面上单击了什么元素,JavaScript会为我处理。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您需要在鼠标按下事件上添加处理程序

<wpf:ChromiumWebBrowser Grid.Column="1" Grid.Row="0" x:Name="myBrowser" UseLayoutRounding="True"/>

myBrowser.AddHandler(UIElement.MouseUpEvent, new MouseButtonEventHandler(Browser_MouseUp), true);

private static void Browser_MouseUp(object sender, MouseButtonEventArgs e)
{//Check for button that was clicked and e.Source ...
}

答案 1 :(得分:1)

如果您正在JavaScript中捕获click事件,以获取实际上是您的事件的页面上选定的内容。在您的JavaScript中,从该单击中调用C#方法。

例如,在我写的一个应用程序中,我在CefSharp中渲染了一个D3页面,其中显示了一个力布局图,当用户单击该力布局中的某个项目时,JavaScript将该项目的ID发送给了C#,这反过来又将其发送给C#将序列化的数据返回给JavaScript,然后显示出来(实际上,我有一个C#类,它充当CefSharp和我的模型之间的往来于JavaScript的序列化层)。听起来您需要采取类似的方法来实现目标,而不需要在浏览器控件本身上进行实际的点击事件。

我在下面添加了一些示例代码,这些代码在CefSharp中(在index.html中定义)在屏幕上显示了一个按钮。单击该按钮时,它将页面中的值传递给JsHandler类,该类又显示一个带有该值的消息框。

Mainwindow.xaml

<Window x:Class="CefSharpWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CefSharpWPF"
        xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <wpf:ChromiumWebBrowser Grid.Row="0"
                                x:Name="Browser" />
    </Grid>
</Window>

Mainwindow.cs

    public partial class MainWindow : Window
    {
        JsHandler jsHandler = new JsHandler();

        public MainWindow()
        {
            InitializeComponent();
            Browser.Address = Environment.CurrentDirectory + "/index.html";
            Browser.JavascriptObjectRepository.Register("jsHandler", jsHandler);
        }
    }

index.html

    <html>
        <head>
            <script type="text/javascript">
                CefSharp.BindObjectAsync("jsHandler", "jsHandler");
            </script>
            <title>Test Page</title>
        </head>
        <body>
            <button onclick="window.jsHandler.handleJsCall(1)">button</button>
        </body>
    </html>

JsHandler.cs

    class JsHandler
    {
        public void HandleJsCall(int arg)
        {
            MessageBox.Show($"Value Provided From JavaScript: {arg.ToString()}", "C# Method Called");
        }
    }