Skip to main content
 首页 » 编程设计

c#之更改 MapControl 中的重叠顺序

2024年04月17日38duanxz

我需要向 MapControl 添加一些元素,例如:

<Maps:MapControl HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" Loaded="MapControl_Loaded" x:Name="mymap"> 
    <Rectangle x:Name="r1" Width="100" Height="100" Fill="Red"/> 
    <Rectangle x:Name="r2" Width="20" Height="20" Fill="Green"/> 
    <Rectangle x:Name="r3" Width="20" Height="20" Fill="Blue"/> 
    <Rectangle x:Name="r4" Width="20" Height="20" Fill="Yellow"/> 
    <Rectangle x:Name="r5" Width="20" Height="20" Fill="Purple"/> 
</Maps:MapControl> 

我通过代码设置矩形的位置:

        MapControl.SetLocation(r1, new Geopoint(new BasicGeoposition() { 
            Latitude = 45.6593049969524, 
            Longitude = 8.97672694176435 
        })); 
        MapControl.SetNormalizedAnchorPoint(r1, new Point(0.5, 0.5)); 
        MapControl.SetLocation(r2, new Geopoint(new BasicGeoposition() 
        { 
            Latitude = 45.6592821981758, 
            Longitude = 8.97627767175436 
        })); 
        MapControl.SetNormalizedAnchorPoint(r2, new Point(0.5, 0.5)); 
        MapControl.SetLocation(r3, new Geopoint(new BasicGeoposition() 
        { 
            Latitude = 45.6589662004262, 
            Longitude = 8.97650314494967 
        })); 
        MapControl.SetNormalizedAnchorPoint(r3, new Point(0.5, 0.5)); 
        MapControl.SetLocation(r4, new Geopoint(new BasicGeoposition() 
        { 
            Latitude = 45.6604913715273, 
            Longitude = 8.97657556459308 
        })); 
        MapControl.SetNormalizedAnchorPoint(r4, new Point(0.5, 0.5)); 
        MapControl.SetLocation(r5, new Geopoint(new BasicGeoposition() 
        { 
            Latitude = 45.6580915488303, 
            Longitude = 8.97816779091954 
        })); 

矩形从第一个 (r1) 渲染到最后一个 (r5),因此 r5 与其他矩形重叠,r4 与 r3、r2、r1 等重叠...

现在我需要添加另一个矩形 (r6),但我希望 r6 在 r1 下:

    Rectangle r6 = new Rectangle(); 
    r6.Width = 70; 
    r6.Height = 70; 
    r6.Fill = new SolidColorBrush(Colors.Coral); 
    mymap.Children.Insert(0, r6); 
    MapControl.SetLocation(r6, new Geopoint(new BasicGeoposition() 
    { 
        Latitude = 45.6594054121524, 
        Longitude = 8.97751081734896 
    })); 
    MapControl.SetNormalizedAnchorPoint(r6, new Point(0.5, 0.5)); 

我使用“mymap.Children.Insert(0, r6);”而是“Children.Add”将 r6 放在第一个位置,但它不起作用,它被渲染为好像它是最后一个元素。

我尝试使用 Canvas.SetZIndex,但它在 MapControl 上不起作用。

所以问题是,如何将 r6 添加到 MapControl 并将其呈现为第一个元素?

请您参考如下方法:

呈现顺序取决于将控件添加到 MapControl 的时间。虽然你在第一个位置插入了 rectangle(r6) 但它是最后添加的,所以它首先被渲染。要更改 MapControl 中 XAML 控件的呈现顺序,我们需要删除 MapControl.Children 中的所有控件。并再次以正确的顺序重新添加它们,如下所示:

private void myMap_Loaded(object sender, RoutedEventArgs e) 
{ 
    //create a list to save the controls already in MapControl 
    var originalChildren = new List<DependencyObject>(); 
    originalChildren = myMap.Children.ToList(); 
 
    //clear the controls 
    myMap.Children.Clear(); 
 
    Rectangle r6 = new Rectangle(); 
    r6.Width = 70; 
    r6.Height = 70; 
    r6.Fill = new SolidColorBrush(Colors.Coral); 
 
    //re-add into MapControl 
    originalChildren.Insert(0, r6); 
 
    foreach (var item in originalChildren) 
    { 
        myMap.Children.Add(item); 
    } 
 
    MapControl.SetLocation(r1, new Geopoint(new BasicGeoposition() 
    { 
        Latitude = 45.6593049969524, 
        Longitude = 8.97672694176435 
    })); 
    MapControl.SetNormalizedAnchorPoint(r1, new Point(0.5, 0.5)); 
    MapControl.SetLocation(r2, new Geopoint(new BasicGeoposition() 
    { 
        Latitude = 45.6592821981758, 
        Longitude = 8.97627767175436 
    })); 
    MapControl.SetNormalizedAnchorPoint(r2, new Point(0.5, 0.5)); 
    MapControl.SetLocation(r3, new Geopoint(new BasicGeoposition() 
    { 
        Latitude = 45.6589662004262, 
        Longitude = 8.97650314494967 
    })); 
    MapControl.SetNormalizedAnchorPoint(r3, new Point(0.5, 0.5)); 
    MapControl.SetLocation(r4, new Geopoint(new BasicGeoposition() 
    { 
        Latitude = 45.6604913715273, 
        Longitude = 8.97657556459308 
    })); 
    MapControl.SetNormalizedAnchorPoint(r4, new Point(0.5, 0.5)); 
    MapControl.SetLocation(r5, new Geopoint(new BasicGeoposition() 
    { 
        Latitude = 45.6580915488303, 
        Longitude = 8.97816779091954 
    })); 
 
    MapControl.SetLocation(r6, new Geopoint(new BasicGeoposition() 
    { 
        Latitude = 45.6594054121524, 
        Longitude = 8.97751081734896 
    })); 
    MapControl.SetNormalizedAnchorPoint(r6, new Point(0.5, 0.5)); 
}