Необходим способ стилизации внутреннего 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>
Канцелярские кнопки останутся полностью непрозрачными, но само изображение карты будет затенено.