2016-03-29 11 views
2

1 Es war ganz einfach, Pushpins und was auch immer Sie möchten zu mehreren Layern hinzuzufügen, diese Layer zu löschen und sicherzustellen, dass einige Elemente vor anderen liegen. Mit Windows 10 ist diese Kontrolle weg und durch ein Steuerelement mit der Hälfte der Dinge ersetzt, die ich wirklich brauche, aber mit 3D und Szenen (Dinge, die ich nicht verwende)Hinzufügen von Z-Index zu XAML-Steuerelementen in Windows 10 MapControl

Mein erster Versuch war, ok, MapPolygon hat ZIndex weil sie von MapElement erbt und

internal interface IMapElement 
{ 
    System.Boolean Visible { get; set; } 
    System.Int32 ZIndex { get; set; } 
} 

Groß implementiert, lässt das in meinem Usercontrol implementieren, so dass die Karte Steuerung weiß, wie jedes Element zu zeichnen. ÜBERRASCHUNG! Diese Schnittstelle ist intern, man kann nichts anderes tun, als darauf zu starren.

Zweite attampet, vielleicht haben sie eine Leinwand verwenden, um die Elemente zu zeichnen, und Leinwand hat eine ZIndex, lass uns gut, unnötig zu sagen, dass es funktioniert Artikel nicht

pin.SetValue(Canvas.ZIndexProperty);

Kann jemand mir bitte sagen, Wenn es im UWP MapControl etwas wie Ebenen gibt oder wenn es eine Möglichkeit gibt, MapControl mitzuteilen, in welchem ​​Index die Objekte gezeichnet werden sollen?

Grüße.

+0

Haben Sie es lösen? –

+0

Nein, habe ich nicht. Sie müssen nur Tricks wie Elemente nach der Bestellung in irgendeiner Weise hinzufügen. – toroveneno

Antwort

0

Können Sie das nicht deklarativ tun? Betrachten Sie das folgende XAML:

<maps:MapControl x:Name="myMap" HorizontalAlignment="Left"> 
    <maps:MapItemsControl x:Name="MapItems" ItemsSource="{Binding}"> 
    <maps:MapItemsControl.ItemTemplate> 
     <DataTemplate> 
     <Button x:Name="MapItemButton" Background="Transparent"> 
      <StackPanel> 
      <Border Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
       <TextBlock Text="{Binding Title}"/> 
      </Border> 
      <Image Source="{Binding ImageSourceUri}" maps:MapControl.Location="{Binding Location}"> 
       <Image.Transitions> 
       <TransitionCollection> 
        <EntranceThemeTransition/> 
       </TransitionCollection> 
       </Image.Transitions> 
      </Image> 
      </StackPanel> 
     </Button> 
     </DataTemplate> 
    </maps:MapItemsControl.ItemTemplate> 
    </maps:MapItemsControl> 
</maps:MapControl> 

Hier, ich bin im Grunde verbindliche Bilder (mapelements) direkt auf die Lage der Karte regelmäßig XAML Funktionen verwenden. Verwenden Sie Gitterlayer, Stackpanels und Whatnots, um zu steuern, was oben drauf geht, was untergeht usw. Sie können dies natürlich auch über Codebehind konstruieren.

+0

Ich weiß, dass ich jetzt ein Datatemplate auf die Steuerelemente anwenden kann, aber was ich wollte, ist, wenn ich 50 Elemente habe und wenn ich in das 25. Element klicke, bringe es nach vorne und ändere die ZIndex Eigenschaft leicht. – toroveneno

1

Ich bin mir nicht sicher, ob es Ihr Problem löst, aber definitiv hat es mein Problem gelöst und es könnte auch für andere Menschen hilfreich sein.

public class MapControl : DependencyObject 
{ 

    #region Dependency properties 

    public static readonly DependencyProperty ZIndexProperty = DependencyProperty.RegisterAttached("ZIndex", typeof(int), typeof(MapControl), new PropertyMetadata(0, OnZIndexChanged)); 

    #endregion 


    #region Methods 

    public static int GetZIndex(DependencyObject obj) 
    { 
     return (int)obj.GetValue(ZIndexProperty); 
    } 

    private static void OnZIndexChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ContentControl us = d as ContentControl; 

     if (us != null) 
     { 
      // returns null if it is not loaded yet 
      // returns 'DependencyObject' of type 'MapOverlayPresenter' 
      var parent = VisualTreeHelper.GetParent(us); 

      if (parent != null) 
      { 
       parent.SetValue(Canvas.ZIndexProperty, e.NewValue); 
      } 
     } 
    } 

    public static void SetZIndex(DependencyObject obj, int value) 
    { 
     obj.SetValue(ZIndexProperty, value); 
    } 

    #endregion 

} 

Namespaces

xmlns:maps="using:Windows.UI.Xaml.Controls.Maps" 
xmlns:mapHelper="using:yournamespace" 

Steuerung

<maps:MapControl> 
    <maps:MapItemsControl ItemsSource="..."> 
     <maps:MapItemsControl.ItemTemplate> 
      <DataTemplate x:DataType="..."> 
       <YourTemplate mapHelper:MapControl.ZIndex="{x:Bind ZIndex, Mode=OneWay}" /> 
      </DataTemplate> 
     </maps:MapItemsControl.ItemTemplate> 
    </maps:MapItemsControl> 
</maps:MapControl> 
+0

Ich hatte das gleiche Problem und löste es, indem ich Ihrer Antwort folgte, aber mit ein paar Änderungen. In meinem Fall war 'YourTemplate' ein' StackPanel', damit der obige Code funktioniert, musste ich das 'ContentControl us = d als ContentControl;' entfernen, weil es immer auf null gesetzt wurde. Also entfernte ich die äußere if-Anweisung und alles funktionierte wie erwartet. Vielen Dank. – Cosmin