Let's see an example:
var mapToolsOverlayControl = new MapToolsOverlayControl
{
DataContext = new MapToolsOverlayControlViewModel()
};
MapView.Active.AddOverlayControl(mapToolsOverlayControl);
Then if I call MapView.Active.GetOverlayControls(), I'll get objects of these types:
ArcGIS.Desktop.Internal.Mapping.Controls.MapCreditsControl
ArcGIS.Desktop.Internal.Mapping.Controls.AirspaceControlWrapper
Where is my MapToolsOverlayControl?
Inspecting things with reflection I found that GetOverlayControls returns UIElements that has UserControl property. So I'm able to find my control with reflection. But why it is wrapped to some internal class (AirspaceControlWrapper)? It's not what user expects from AddOverlayControl.
If you need to wrap added control for some reason, please return new object from AddOverlayControl and give a remark in docs with snippet of how to get a control after it's added on map.
Solved! Go to Solution.
So Max, I have looked closely at this and discussed with the original developer.This is designed behavior.
Please use GetOverlayControls to examine which controls are already on the overlay. The returned UIElements can then be queried for their size and placement information [on the overlay]. For example, perhaps you have a preferred placement and prior to adding your control you want to detect if a control (perhaps placed by Pro or another add-in) already occupies that "space". Based on your examination of the existing overlay controls, your logic could adjust your default position accordingly, alter ZOrder, etc.
It is not intended that you cast the controls to their underlying type. Simply use them "as" UIElement. Cast to FrameworkElement also, if needed.
If you do need reference to your control "later on" you should hold a reference to it.
We will update the API reference for AddOverlayControl and GetOverlayControls for 2.4
Max, this could be a bug. I'll look into it.
Any news?
So Max, I have looked closely at this and discussed with the original developer.This is designed behavior.
Please use GetOverlayControls to examine which controls are already on the overlay. The returned UIElements can then be queried for their size and placement information [on the overlay]. For example, perhaps you have a preferred placement and prior to adding your control you want to detect if a control (perhaps placed by Pro or another add-in) already occupies that "space". Based on your examination of the existing overlay controls, your logic could adjust your default position accordingly, alter ZOrder, etc.
It is not intended that you cast the controls to their underlying type. Simply use them "as" UIElement. Cast to FrameworkElement also, if needed.
If you do need reference to your control "later on" you should hold a reference to it.
We will update the API reference for AddOverlayControl and GetOverlayControls for 2.4