2

在 Google 地球中,当单击地球时,KMLTreeView 中选定项目的背景颜色会变暗。在我基于 C# 的应用程序中,TreeView 节点失去了所有颜色,所以我不知道选择了哪个项目。

同样,当我单击其关联的地标时,我希望树视图节点突出显示,这在 GE 中也是如此。

我认为这是默认行为,因此我不能将地标与 kmltreeview 正确关联。下面是我用于创建节点并将其添加到地球以及 kmltreeview 控件的代码。是否有什么我做错或没有做才能使用默认行为?

谢谢!

dynamic placemark = KmlHelpers.CreatePlacemark(ge1,
                                               Coord,
                                               d.sSerialNumber,
                                               d.sNickname,
                                               "Device Type: " + d.sName + "<p>" +
                                               "IP Address: " + d.sIPAddress + "<p>" +
                                               "ESN: " + d.sSerialNumber + "<p>" +
                                               "<a href=\"http://localhost/index.html#"
                                               + d.sSerialNumber + "\">Details</a>");

var styleMap = ge1.createStyleMap("");

// Create normal style for style map.
var normalStyle = ge1.createStyle("");
var normalIcon = ge1.createIcon("");
normalIcon.setHref("http://maps.google.com/mapfiles/kml/shapes/truck.png");
normalStyle.getIconStyle().setIcon(normalIcon);

// Create highlight style for style map.
var highlightStyle = ge1.createStyle("");
var highlightIcon = ge1.createIcon("");
highlightIcon.setHref("http://maps.google.com/mapfiles/kml/shapes/truck.png");
highlightStyle.getIconStyle().setIcon(highlightIcon);
highlightStyle.getIconStyle().setScale(2.0);
styleMap.setNormalStyle(normalStyle);
styleMap.setHighlightStyle(highlightStyle);

// Apply stylemap to a placemark.
placemark.setStyleSelector(styleMap);

kmlTreeView.ParseKmlObject(placemark);
4

1 回答 1

2

KmlTreeView继承自标准TreeView 控件,因此您可以使用HideSelection属性。默认情况下,这设置为,但是...True

当此属性设置为 false 时,TreeView 控件中的选定节点保持突出显示的颜色与 TreeView 控件失去焦点时当前选择的颜色不同。当用户单击表单上的不同控件或移动到不同的窗口时,您可以使用此属性使用户选择的项目保持可见。

要在代码中执行此操作,例如:

kmlTreeView.HideSelection = False;

此外,可以在控件的可视化设计器中设置属性,只需选择 KmlTreeView,然后查看属性。最后双击HideSelection设置为False

更新:

对于问题的第二部分,当单击相应功能时突出显示一个节点,您需要编写一个自定义事件处理程序,然后使用 KmlTreeView 的GetNodeById方法。像下面这样的东西应该可以工作。

private void GEWebBrowser1OnPluginReady(object sender, GEEventArgs geEventArgs)
{
    this.geWebBrowser1.AddEventListener(geEventArgs.ApiObject.getGlobe(), EventId.MouseDown);
    this.geWebBrowser1.KmlEvent += geWebBrowser1_KmlEvent;
}

void geWebBrowser1_KmlEvent(object sender, GEEventArgs e)
{
    // the feature that the mousedown event fired on
    dynamic feature = e.ApiObject.getTarget();

    // If you have other events added you will need some conditional logic here
    // to sort out which event has fired. e.g.
    // if(e.EventId == EventId.MouseDown)
    // if(GEHelpers.IsApiType(feature, ApiType.KmlPlacemark);
    // etc..

    string id = feature.getId(); // the features id
    KmlTreeViewNode node = myKmlTreeView.GetNodeById(id);   // find the corresponding node...    
    if(node == null) { return; } // no corresponding node...

    // set the selected node to the feature node.
    myKmlTreeView.SelectedNode = node; 

    // make sure the node is visible in the treeview
    if (!node.IsVisible)
    {
        node.EnsureVisible();
    }
}
于 2012-11-29T01:55:21.870 回答