使用WPF对OpenLayers进行鼠标穿透。

问题描述 投票:0回答:1

我目前正试图在WPF窗口中更新一个程序内的地图,从OpenLayers 3到6.3.1。然而,我遇到了一个问题,鼠标没有传递到地图上。

我正在做的软件在路线图上画了一堆边框(使用Basemap),以显示在给定时间内的运力利用率,并计算出理想的路线之类的东西(类似于谷歌地图)。当我点击地图时,它应该在第二个窗口中显示离我最近的边缘的可用数据,这些方法已经实现了,我只需要找出我点击的位置。

我使用的代码看起来像这样。 (缩短了一些我可能不应该分享的东西)

index.html.s: 列表中的内容。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" http-equiv="X-UA-Compatible" content="IE=edge">
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=fetch,requestAnimationFrame,Element.prototype.classList,URL"></script>
    <script src ="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  </head>
  <body>
    <div id="map" class="map"></div>
    <script src="index.js"></script>
  </body>
</html>

index.js:

import Map from 'ol/Map.js';
import View from 'ol/View.js';
import TileLayer from 'ol/layer/Tile.js';

import WMTS, {optionsFromCapabilities} from 'ol/source/WMTS.js';
import WMTSCapabilities from 'ol/format/WMTSCapabilities.js';

import {fromLonLat} from 'ol/proj';
import {toLonLat} from 'ol/proj';
import {defaults as defaultInteractions} from 'ol/interaction';

import 'ol-layerswitcher/src/ol-layerswitcher.css';
import LayerSwitcher from 'ol-layerswitcher';
var capabilitiesUrl = 'https://www.basemap.at/wmts/1.0.0/WMTSCapabilities.xml';

var map = new Map({
    layers: [],
    target: 'map',
    view: new View({
        center:  [0,0],
        zoom: 2
    }),
    interactions: defaultInteractions()
});
var layerSwitcher = new LayerSwitcher();
map.addControl(layerSwitcher);

fetch(capabilitiesUrl).then(function(response) {
    return response.text();
}).then(function(text) {

    var result = new WMTSCapabilities().read(text);
    var options = optionsFromCapabilities(result, {
      layer: hidpiLayer,
      matrixSet: 'google3857',
      style: 'normal'
    });

    map.addLayer(new TileLayer({
        title: 'Basemap',
        type: 'base',
        source: new WMTS((options))
    }));
});

当我在浏览器中运行它时,它的工作没有任何问题, 但在WPF中,我不能拖动地图, 而且它也没有登记任何鼠标点击。拖动不会那么糟糕,因为我仍然可以用键盘移动,但点击对程序的功能至关重要。

我猜测问题出在OpenLayers和WPF之间的通信中,但在OpenLayers 3上它可以工作,所以我真的不知道该从哪里找。

如果有人能给我指出正确的方向,我会非常感激,因为我已经没有办法了。

javascript wpf openlayers
1个回答
0
投票

这里是一个如何处理DoubleClick事件的例子。

.NET

Private WithEvents m_Document As mshtml.HTMLDocument

Private Sub WebBrowserControl_Navigated(ByVal sender As Object, ByVal e As NavigationEventArgs) Handles WebBrowserControl.Navigated

    m_Document = TryCast(Me.WebBrowserControl.Document, mshtml.HTMLDocument)
    If m_Document IsNot Nothing Then AddHandler m_Document.ondblclick, AddressOf DoubleClickHandler

End Sub

Private Function DoubleClickHandler() As Boolean

    If Mouse.Capture(Me.WebBrowserControl) Then
        Dim m_Position As Point = Mouse.GetPosition(Me.WebBrowserControl)
        Mouse.Capture(Nothing)
        Dim m_Object() As Object = {m_Position.X, m_Position.Y}
        Me.WebBrowserControl.InvokeScript("centerMap", m_Object)
        Return True
    Else
        Return False
    End If

End Function

另外,不需要捕捉鼠标指针。

Private WithEvents m_Document As mshtml.HTMLDocument

Private Sub WebBrowserControl_Navigated(ByVal sender As Object, ByVal e As NavigationEventArgs) Handles WebBrowserControl.Navigated

    m_Document = TryCast(Me.WebBrowserControl.Document, HTMLDocument)
    If m_Document IsNot Nothing Then
        Dim m_DocumentEvent As HTMLDocumentEvents2_Event = TryCast(m_Document, HTMLDocumentEvents2_Event)
        If m_DocumentEvent IsNot Nothing Then AddHandler m_DocumentEvent.ondblclick, AddressOf DoubleClickEventHandler
    End If

End Sub

Private Function DoubleClickEventHandler(ByVal e As IHTMLEventObj) As Boolean

    Dim m_Object() As Object = {e.clientX, e.clientY}
    Try
        Me.WebBrowserControl.InvokeScript("centerMap", m_Object)
    Catch
        Return False
    End Try
    Return True

End Function

JavaScript

function centerMap(x, y) {
        map.getView().setCenter(map.getCoordinateFromPixel([x, y]));
    }     
© www.soinside.com 2019 - 2024. All rights reserved.