XAMLMapControlへのカスタムルートを実装しようとしています。このルートには、選択可能で移動可能なポイント(サンプルマップポイント)とそれらを接続するポリラインがあり、可視性プロパティを介してオン/オフを切り替えることができます。ルートクラスと、それに送信するルートクラスからポリラインとポイントの両方を生成するカスタムユーザーコントロールがあります。ルートの配列を介してルートオブジェクトを送信します。問題は、実際にデータをフェッチしてポイントとポリラインをレンダリングするために取得できないことです。これが私のRouteControl.XAMLです
<UserControl x:Class="Map_Test.RouteControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:map="clr-namespace:MapControl;assembly=MapControl.WPF">
<UserControl.Resources>
<Style x:Key="PointItemStyle" TargetType="map:MapItem" >
<Setter Property="map:MapPanel.Location" Value="{Binding Location}"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="map:MapItem">
<Canvas>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal"/>
<VisualState x:Name="Disabled"/>
<VisualState x:Name="MouseOver">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="labelBackground" Storyboard.TargetProperty="Opacity" To="0.7" Duration="0:0:0.1"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected"/>
<VisualState x:Name="Selected">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="selectedPath" Storyboard.TargetProperty="Opacity" To="0.7" Duration="0:0:0.1"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Path x:Name="selectedPath" Fill="White" Opacity="0">
<Path.Data>
<EllipseGeometry RadiusX="15" RadiusY="15"/>
</Path.Data>
</Path>
<Path StrokeThickness="2" Fill="Transparent">
<Path.Stroke>
<SolidColorBrush Color="Gray"/>
</Path.Stroke>
<Path.Data>
<EllipseGeometry RadiusX="8" RadiusY="8"/>
</Path.Data>
</Path>
<Grid Canvas.Left="15" Canvas.Top="-8">
<Rectangle x:Name="labelBackground" Fill="White" Opacity="0"/>
<!--local:OutlinedText Margin="1" OutlineThickness="1.5" Text="{Binding Name}"/-->
</Grid>
</Canvas>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Panel.ZIndex" Value="1"/>
</Trigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<map:MapPanel>
<map:MapPolyline Locations="{Binding Locations, RelativeSource={RelativeSource AncestorType=UserControl}}"
Stroke="{Binding Foreground, RelativeSource={RelativeSource AncestorType=UserControl}}"
StrokeThickness="3"/>
<map:MapItemsControl ItemsSource="{Binding Points}"
ItemContainerStyle="{StaticResource PointItemStyle}"
IsSynchronizedWithCurrentItem="True"
SelectionMode="Extended"
MouseLeftButtonDown="PathMouseLeftButtonDown"
MouseLeftButtonUp="PathMouseLeftButtonUp"
MouseMove="PathMouseMove"/>
</map:MapPanel>
私のルートクラス
public class RoutePoint : PropertyChangedBase
{
private Location location;
public Location Location
{
get { return location; }
set
{
location = value;
NotifyOfPropertyChange(() => location);
}
}
}
public class Route : PropertyChangedBase
{
public ObservableCollection<RoutePoint> Points { get; set; }
public BindableCollection<Location> Locations{ get; set; }
public bool Visible { get; set; }
public Route()
{
Locations = new BindableCollection<Location>();
Points = new ObservableCollection<RoutePoint>();
Visible = true;
Location = new Location();
}
}
}
このようなオブジェクトを作成します
<DataTemplate x:Key="RouteTemplate">
<local:RouteControl DataContext="Routes"></local:RouteControl>
</DataTemplate>
...
<map:MapItemsControl ItemTemplate="{StaticResource RouteTemplate}"
ItemsSource="{Binding Routes}"/>
xamlからRouteコレクションのすべてのオブジェクトのLocations配列とRoutePoints配列にアクセスするにはどうすればよいですか?
解決策を見つけました:カスタムコントロールを作成する代わりに、パネルにあるコントロールを使用してカスタムスタイルを作成しました。これはそれがどのように見えるかです
<Style x:Key="RouteTemplate" TargetType="map:MapItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Visible}" Value="True"></DataTrigger>
</Style.Triggers>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="map:MapItem">
<map:MapPanel>
<map:MapPolyline Locations="{Binding Locations}" Stroke="Red" StrokeThickness="3"/>
<map:MapItemsControl ItemsSource="{Binding Points}"
ItemContainerStyle="{StaticResource PointItemStyle}"
IsSynchronizedWithCurrentItem="True"
SelectionMode="Extended" AllowDrop="True"/>
</map:MapPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
そして、私はそれをこのようにバインドします
<map:MapItemsControl ItemContainerStyle="{StaticResource RouteTemplate}"
ItemsSource="{Binding Routes}"/>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加