Как установить непрозрачность слоя API Bing Map, но сохранить полную 100% непрозрачность для объектов PushPins? - PullRequest
2 голосов
/ 07 мая 2011

Я бы хотел исчезнуть слой воздушной карты, установив непрозрачность. НО, я бы не хотел сохранять альфа-канал (непрозрачность) для любых объектов (то есть кнопок), которые отображаются поверх карты.

Кто-нибудь знает, возможно ли это (API каким-то образом поддерживает это)?

Спасибо!

1 Ответ

1 голос
/ 07 мая 2011

Необходим способ стилизации внутреннего MapTileLayer, который используется элементом управления Map для отображения самой карты. К сожалению, API не обеспечивает такой уровень доступа.

Однако мы можем использовать VisualTreeHelper для получения доступа к MapTileLayer. Я использую класс расширений в этом блоге , чтобы помочь с этим. С этим классом, присутствующим в проекте, мы могли бы сделать что-то похожее на это: -

        MapTileLayer tileLayer = myMapControl.Descendents().OfType<MapTileLayer>().FirstOrDefault();
        if (tileLayer != null)
        {
            tileLayer.Opacity = 0.5;  // set the opacity desired.
        }

Однако, вероятно, лучше всего сделать это правильно, создав новый класс, производный от Map и назначив стиль вместо одного свойства, такого как Opacity.

[StyleTypedProperty(Property = "TileLayerStyle", StyleTargetType = typeof(MapTileLayer))]
public class MapEx : Map
{
    #region public Style TileLayerStyle
    public Style TileLayerStyle
    {
        get { return GetValue(TileLayerStyleProperty) as Style; }
        set { SetValue(TileLayerStyleProperty, value); }
    }

    public static readonly DependencyProperty TileLayerStyleProperty =
        DependencyProperty.Register(
            "TileLayerStyle",
            typeof(Style),
            typeof(MapEx),
            new PropertyMetadata(null, OnTileLayerStylePropertyChanged));

    private static void OnTileLayerStylePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MapEx source = d as MapEx;
        source.SetTileLayerStyle();
    }
    #endregion public Style TileLayerStyle

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        SetTileLayerStyle();
    }

    private void SetTileLayerStyle()
    {
        MapTileLayer tileLayer = this.Descendents().OfType<MapTileLayer>().FirstOrDefault();
        if (tileLayer != null)
        {
            tileLayer.Style = TileLayerStyle;
        }
    }

С помощью этой производной мы можем сделать следующее: -

<UserControl x:Class="HostBingMaps.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:HostBingMaps"
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"
    xmlns:m="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl">
  <Grid x:Name="LayoutRoot">
        <Grid.Resources>
            <Style x:Key="TileLayerStyle" TargetType="m:MapTileLayer">
                <Setter Property="Opacity" Value="0.2" />
            </Style>
        </Grid.Resources>
        <local:MapEx Mode="Aerial" TileLayerStyle="{StaticResource TileLayerStyle}" AnimationLevel="UserInput" UseInertia="True"  CredentialsProvider="__creds_here__">
              <!-- Pushpins here --> 
      </local:MapEx>
    </Grid>
</UserControl>

Канцелярские кнопки останутся полностью непрозрачными, но само изображение карты будет затенено.

...