Estoy trabajando en este proyecto de superficie donde tenemos un control de mapas bing y donde nos gustaría dibujar polilíneas en el mapa, mediante el enlace de datos.WPF mapas de control polilíneas/polígonos no dibujar en primer lugar agregar a la colección
El extraño comportamiento que ocurre es que cuando hago clic en el botón Agregar, no ocurre nada en el mapa. Si muevo el mapa un poco, la polilínea se dibuja en el mapa. Otro escenario que funciona, haga clic en el botón Agregar una vez, no pasa nada, haga clic de nuevo. Se dibujan ambas polilíneas. (En mi colección manual tengo 4 LocationCollections) así que lo mismo ocurre con el tercer clic y el cuarto clic donde nuevamente se dibujan ambas líneas.
No tengo ni idea de dónde buscar para solucionarlo. Intenté suscribirme a los eventos Layoutupdated, que ocurren en ambos casos. También se agregó un evento de colección cambiada a la colección observable para ver si el complemento se activó, y sí se desencadena. Otra cosa que probé es cambiar la polilínea a chincheta y tomar la primera ubicación de la colección de ubicaciones en el modelo de pipelineview, de lo que está funcionando.
He subido un sample project para ver qué está pasando.
Realmente espero que alguien pueda señalarme en la dirección correcta, porque ya no tengo ni idea.
A continuación encontrará el código que he escrito:
tengo los siguientes ViewModels:
MainViewModel
public class MainViewModel
{
private ObservableCollection<PipelineViewModel> _pipelines;
public ObservableCollection<PipelineViewModel> Pipes
{
get { return _pipelines; }
}
public MainViewModel()
{
_pipelines = new ObservableCollection<PipelineViewModel>();
}
}
Y el PipelineViewModel que tiene la colección de ubicaciones que implementa INotifyPropertyChanged :
Pipelin eViewModel
public class PipelineViewModel : ViewModelBase
{
private LocationCollection _locations;
public string Geometry { get; set; }
public string Label { get; set; }
public LocationCollection Locations
{
get { return _locations; }
set
{
_locations = value;
RaisePropertyChanged("Locations");
}
}
}
Mi XAML se parece a continuación:
<s:SurfaceWindow x:Class="SurfaceApplication3.SurfaceWindow1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:s="http://schemas.microsoft.com/surface/2008"
xmlns:m="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF"
Title="SurfaceApplication3">
<s:SurfaceWindow.Resources>
<DataTemplate x:Key="Poly">
<m:MapPolyline Locations="{Binding Locations}" Stroke="Black" StrokeThickness="5" />
</DataTemplate>
</s:SurfaceWindow.Resources>
<Grid>
<m:Map ZoomLevel="8" Center="52.332074,5.542302" Name="Map">
<m:MapItemsControl Name="x" ItemsSource="{Binding Pipes}" ItemTemplate="{StaticResource Poly}" />
</m:Map>
<Button Name="add" Width="100" Height="50" Content="Add" Click="add_Click"></Button>
</Grid>
</s:SurfaceWindow>
Y en nuestro código subyacente que son la creación de la unión y el evento click de esta manera:
private int _counter = 0;
private string[] geoLines;
private MainViewModel _mainViewModel = new MainViewModel();
/// <summary>
/// Default constructor.
/// </summary>
public SurfaceWindow1()
{
InitializeComponent();
// Add handlers for window availability events
AddWindowAvailabilityHandlers();
this.DataContext = _mainViewModel;
geoLines = new string[4]{ "52.588032,5.979309; 52.491143,6.020508; 52.397391,5.929871; 52.269838,5.957336; 52.224435,5.696411; 52.071065,5.740356",
"52.539614,4.902649; 52.429222,4.801025; 52.308479,4.86145; 52.246301,4.669189; 52.217704,4.836731; 52.313516,5.048218",
"51.840869,4.394531; 51.8731,4.866943; 51.99841,5.122375; 52.178985,5.438232; 51.8731,5.701904; 52.071065,6.421509",
"51.633362,4.111633; 51.923943,6.193542; 52.561325,5.28717; 52.561325,6.25946; 51.524125,5.427246; 51.937492,5.28717" };
}
private void add_Click(object sender, RoutedEventArgs e)
{
PipelineViewModel plv = new PipelineViewModel();
plv.Locations = AddLinestring(geoLines[_counter]);
plv.Geometry = geoLines[_counter];
_mainViewModel.Pipes.Add(plv);
_counter++;
}
private LocationCollection AddLinestring(string shapegeo)
{
LocationCollection shapeCollection = new LocationCollection();
string[] lines = Regex.Split(shapegeo, ";");
foreach (string line in lines)
{
string[] pts = Regex.Split(line, ",");
double lon = double.Parse(pts[1], new CultureInfo("en-GB"));
double lat = double.Parse(pts[0], new CultureInfo("en-GB"));
shapeCollection.Add(new Location(lat, lon));
}
return shapeCollection;
}
No puedo ayudar en esto, pero he probado el proyecto de ejemplo; hizo algunas cosas de prueba y error (Invalidar, forzar el movimiento del mapa) pero tampoco tiene idea de por qué no está funcionando. Todo lo que has implementado se ve bien. Pero aquí hay algunos hallazgos: Agregar MapPolyline de CodeBehind funciona bien. Si usa otro elemento como Pushpin, también funciona bien. Entonces, el problema tiene que ver con todo lo que hereda de MapShapeBase.Y eso son MapPolyline y MapPolygon. Lo busqué a través de Reflector e intenté comparar la implementación de Pushpin con la implementación de MapPolyline. – SvenG
No puedo invertir más tiempo, pero si pudiera, podría depurar el código reflejado y echar un vistazo por qué se actualiza correctamente un marcador, pero MapPolyLine/MapPolygon no lo está. – SvenG
Hola SvenG, gracias por tu tiempo mirándolo. Sí, he visto que los marcadores funcionan bien. También he llamado al método UpdateLayout() en MapItemsControl y luego agregué un UIElement vacío a la capa y se mostrará la polilínea. Todavía tengo que decir por qué no está funcionando :( – ChristiaanV