当TreeView失去焦点时,如何保持KMLTreeView项目“被选中”?

时间:2012-11-27 17:26:43

标签: c# winforms treeview google-earth-plugin

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

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

我认为这是默认行为,所以我不能正确地将地标与kmltreeview相关联。下面是我用于创建节点并将节点添加到globe以及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);

1 个答案:

答案 0 :(得分:2)

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

  

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

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

kmlTreeView.HideSelection = False;

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

<强>更新

对于问题的第二部分,在单击coorisponding功能时突出显示节点,您需要编写自定义事件处理程序,然后使用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();
    }
}