none
Pushpin con imagen y texto RRS feed

  • Pregunta

  • Buenas,

    Estoy intentando agregar una imagen y un texto en el mapa de Bing en cada punto del mapa y que dispara un evento al clicar.

    Por ahora estoy con la parte de poner el punto del mapa con una imagen y un texto pero no me esta funcionando los dos al mismo tiempo.

     

    Lo tengo así

     

    Pushpin pin = new Pushpin();
    
        
          pin.Location = new GeoCoordinate(40.4202995300293, -3.70577502250671);
          
          ImageBrush image = new ImageBrush()
          {
            ImageSource = new System.Windows.Media.Imaging.BitmapImage
                     (new Uri("Images/metro-1-4.png",UriKind.Relative))
          };
    
          pin.Content = "Texto" + image;
       
          BingMap.Children.Add(pin);
    

     

    muchas gracias

    domingo, 7 de agosto de 2011 9:45

Respuestas

  • Hola,

     

    Cambia esto

     

     List<metro> data = (from item in xmlSource.Descendants("lineas")
            select new metro
            {
             id = item.Element("id").Value,
             nombre = item.Element("nombre").Value,
             conexion = item.Element("conexion").Value,
             largo = Convert.ToInt16(item.Element("largo").Value),
             altura = Convert.ToInt16(item.Element("altura").Value),
             latitude = ConvertDouble(item.Element("latitude").Value),
             longitude = ConvertDouble(item.Element("longitude").Value)
            }).ToList();
    
    

     

    por esto 

     

     

    List<metro> data = (from linea in xmlSource.Descendants("lineas")
                select new metro
                {
                  id = int.Parse(linea.Element("id").Value),
                  nombre = linea.Element("nombre").Value,
                  conexion = linea.Element("conexion").Value,
                  latitude = double.Parse(linea.Element("latitude").Value,System.Globalization.CultureInfo.InvariantCulture),
                  longitude = double.Parse(linea.Element("longitude").Value,System.Globalization.CultureInfo.InvariantCulture),
                  altura = int.Parse(linea.Element("altura").Value),
                  largo = int.Parse(linea.Element("largo").Value)
    
                }).ToList();
    

     


    Con esto te va a funcionar, pero piensa que si un xml se graba así

     

    <id>1</id>
     <nombre>Villa de Vallecas </nombre>
     <conexion>1,4,ml1</conexion>
     <latitude></latitude>
     <longitude></longitude>
     <largo></largo>
     <altura></altura>
    


    Se te van a producir errores en 

     

     latitude = double.Parse(linea.Element("latitude").Value,System.Globalization.CultureInfo.InvariantCulture),
                  longitude = double.Parse(linea.Element("longitude").Value,System.Globalization.CultureInfo.InvariantCulture),
                  altura = int.Parse(linea.Element("altura").Value),
                  largo = int.Parse(linea.Element("largo").Value)
    


    Te recomiendo que crees dos metodos tal que así que controlan que la cadena que pasas es vacia o nula.

     

    //Conversor a Double 
        private double ConvertDouble(string Valor)
        {
          double a = 0;
          if (!string.IsNullOrEmpty(Valor))
          {
            if (double.TryParse(Valor, out a))
            {
              return double.Parse(Valor, System.Globalization.CultureInfo.InvariantCulture);
            }
          }
          return a;
        }
        //Conversor Int32
        private int ConvertInt(string Valor)
        {
          int a = 0;
          if (!string.IsNullOrEmpty(Valor))
          {
            int.TryParse(Valor, out a);
            
          }
          return a;
        }
    
    

    y entonces el Xml lo leas de la siguiente forma

     

    List<metro> data = (from linea in xmlSource.Descendants("lineas")
                select new metro
                {
                  id = int.Parse(linea.Element("id").Value),
                  nombre = linea.Element("nombre").Value,
                  conexion = linea.Element("conexion").Value,
                  latitude = ConvertDouble(linea.Element("latitude").Value),
                  longitude = ConvertDouble(linea.Element("longitude").Value),
                  altura = ConvertInt(linea.Element("altura").Value),
                  largo = ConvertInt(linea.Element("largo").Value)
    
                }).ToList();
    

    Ojo esto no solamente es aplicable a Wp7, sino a todo .Net como ya te comente arriba.

     

    Saludos,


    phurtado
    • Marcado como respuesta ElbrinnerMVP lunes, 8 de agosto de 2011 12:06
    lunes, 8 de agosto de 2011 11:45

Todas las respuestas

  • Hola;

    No lo puedo probar  en este momento pero esto ya te digo que está mal.  pin.Content = "Texto" + image. tu piensa que a content tienes que agregarle por ejemplo un stackpanel y a este el texto a traves de un textblock

     y la imagen, pero nunca contatenar "Texto" con una imagen.

    Te paso dos link y el primero enlaza con el segundo, ahi queda claro como hacerlo.

     

    http://stackoverflow.com/questions/6583476/how-to-add-linebreaks-in-map-pushpin-content

     

    http://msdn.microsoft.com/en-us/gg266447

     

    Saludos,

     



    phurtado
    domingo, 7 de agosto de 2011 11:27
  • Al final despues de mucho intentar cambie la forma de hacer... voy a poner la imagen ya con el texto que quiero. De la otra forma no me sale.

     

    La unica pega es que la aplicación funciona bien en el emulador pero no en el telefono.

     

    Falla en esta linea:

     pin.Location = new GeoCoordinate(m.latitude,m.longitude);

     

    Pero a principio estoy pasando un valor DOUBLE como tiene que ser

     

    latitude =  Convert.ToDouble(item.Element("latitude").Value),

    longitude = Convert.ToDouble(item.Element("longitude").Value)

     

    Si pongo la coordenada manualmente me funciona en el telefono.

     

    muchas gracias y un saludo

     

     

    lunes, 8 de agosto de 2011 0:33
  • Hola!

    ¿Que error te da en el teléfono?

    Un saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    lunes, 8 de agosto de 2011 6:04
    Moderador
  • Hola!

    ¿Que error te da en el teléfono?

    Un saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter

    Vuelve a la pantalla del menu al entrar en este apartado.

     

    Si pongo la coordenada a mano funciona tanto en el emulador como en el telefono. Supongo que falla el tipo de dato.

    Los datos estan así en un xml:

    El valor Double suporta esta cantidad, verdad?

    <lineas>

     <latitude>40.419978911087576</latitude>
     <longitude>-3.7018568704733013</longitude>

    </lineas>

     

    gracias

     

    lunes, 8 de agosto de 2011 7:33
  • Hola,

    El problema que yo veo por las lineas de código que pasas que Convert.ToDouble te produzca un exception, de todas formas eso no es problema del emulador ni del telefono,  te pasaría con cualquier tipo de proyecto .net, piensa que item.Element("latitude").Value devuelva por ejemplo una cadena vacia "" o string.Empty, eso te va a probocar un error y por lo que veo en este otro hilo http://social.msdn.microsoft.com/Forums/es-ES/windowsphone7/thread/51351efd-53a1-48fb-a5da-67ec3ac214b4, estás asignando a latitude y longitude el valor de lo que obtienes de leer el Xml.

     

    Si me baso en el anterior hilo y veo la linea que comentas que falla, longitude y latitude las tenías definidas en la clase metro como string, esto lo has cambiado?.

     

    Creo que el problema es simplemente el convertir una cadena a Double. te recomiendo que utilices double.TryParse en vez de Convert.toDouble tal y como te muestro.

     

    double a=0;
    double.TryParse(string.Empty,out a);
    


     

    Saludos,


    phurtado
    lunes, 8 de agosto de 2011 7:35
  • Hola,

    El valor Double suporta esta cantidad, verdad?

    Sí, pero tal y como te comentado en la otra respuesta lo que no soporta "" o string.empty. tu puedes tener estos valores en algún elemento del xml

     

    Vuelve a la pantalla del menu al entrar en este apartado.

     

    Abre el archivo App.Xml.cs y pon un punto de interrupción Application_UnhandledException, te está saltando un exception que no tienes controlado, en ese método a través de ApplicationUnhandledExceptionEventArgs puedes tener información de que es lo que pasa.

     

    Saludos,


    phurtado
    lunes, 8 de agosto de 2011 7:52
  • Hola Pedro,

     

    Creo que el fallo esta por ahi tambien...

    Como tengo que usar?

    Me sale este fallo: Error    3    No se puede convertir implícitamente el tipo 'bool' en 'double' 

     si intento usar de esta forma:

     double.TryParse(item.Element("latitude").Value, out a),

     

    double a=0;
    double.TryParse(string.Empty,out a);

     

    en string.Empty va mi variable no?

     

    En la funcion lo tengo asi:

     

     public double latitude { get; set; }
     public double longitude { get; set; }

     

    gracias


    lunes, 8 de agosto de 2011 8:39
  • Hola,

     

    Me sale este fallo: Error    3    No se puede convertir implícitamente el tipo 'bool' en 'double' 

     

    Esto te pasa por que Tryparse devuelve bool. Create  un metodo tal que asi

     

    private double ConvertDouble(string Valor)
      {
       double a = 0;
       if (Valor != null)
       {
        double.TryParse(Valor, out a);
       }
       return a;
      }
    

     

     

    y cuando lees el xml lo tienes que dejar de esta forma.

     

     

     List<metro> data = (from item in loadedData.Descendants("lineas")
            select new metro
            {
             nombre = item.Element("nombre").Value,
             conexion = item.Element("conexion").Value,
             latitude = ConvertDouble(item.Element("latitude").Value),
             longitude = ConvertDouble(item.Element("longitude").Value)
            }).ToList();
    


     

    Saludos,

     


    phurtado
    • Editado Pedro Hurtado lunes, 8 de agosto de 2011 9:04 Cambio ConvertToDouble por ConvertDouble
    lunes, 8 de agosto de 2011 8:54
  • He puesto de la forma que me dijiste, pero el problema parece ser del bucle.

     

          if (data != null)
          {
      
            List<metro> listametro = new List<metro>();
    
            foreach (metro m in data)
            {
    
    
              Pushpin pin = new Pushpin();
              pin.Background = new SolidColorBrush(Colors.Brown);
    
    
    
              pin.Location = new GeoCoordinate(m.latitude,m.longitude);
              
              
              ImageBrush image = new ImageBrush()
              {
                ImageSource = new System.Windows.Media.Imaging.BitmapImage
                         (new Uri(m.conexion, UriKind.Relative))
              };
              pin.Content = image;
              
              pin.Content = new Rectangle()
              {
                Fill = image,
    
                StrokeThickness = 1,
                Height = m.altura,
                Width = m.largo 
                
    
                
                
    
              };
             
              BingMap.Children.Add(pin);
              
          
             
              
    
            }
    


    Intente llamar el metodo desde: ConvertDouble(m.latitude)

    Me sale este fallo: Error    6    Argumento 1: no se puede convertir de 'double' a 'string'.   

    Error    5    La mejor coincidencia de método sobrecargado para 'METRO.mapa5.ConvertDouble(string)' tiene algunos argumentos no válidos  

    gracias

    lunes, 8 de agosto de 2011 9:40
  • Hola,

     

    Intente llamar el metodo desde: ConvertDouble(m.latitude)

    Me sale este fallo: Error    6    Argumento 1: no se puede convertir de 'double' a 'string'.   

    Error    5    La mejor coincidencia de método sobrecargado para 'METRO.mapa5.ConvertDouble(string)' tiene algunos argumentos no válidos  

     

    Una cosa m.latitude que es double o string, por lo que veo double?. Yo te comente que utilizces ConvertDouble para convertir el valor del Xml que es string a double, no para ejecutar ConvertDouble(m.latitude);

     

    He puesto de la forma que me dijiste, pero el problema parece ser del bucle.

     

    Por que no controlas la exception de esta forma y así sabemos que es lo que pasa

     try
          {
              if (data != null)
           {
         
            List<metro> listametro = new List<metro>();
    
            foreach (metro m in data)
            {
    
    
             Pushpin pin = new Pushpin();
             pin.Background = new SolidColorBrush(Colors.Brown);
    
    
    
             pin.Location = new GeoCoordinate(m.latitude,m.longitude);
             
             
             ImageBrush image = new ImageBrush()
             {
              ImageSource = new System.Windows.Media.Imaging.BitmapImage
                   (new Uri(m.conexion, UriKind.Relative))
             };
             pin.Content = image;
             
             pin.Content = new Rectangle()
             {
              Fill = image,
    
              StrokeThickness = 1,
              Height = m.altura,
              Width = m.largo 
              
    
              
              
    
             };
             
             BingMap.Children.Add(pin);
         
       
         
         
    
        
    
          }
          catch (Exception ex)
          {
            MessageBox.Show(string.Format("{0}{1}{2}",ex.Message,Environment.NewLine,ex.StackTrace));
          }
    

    Saludos,


     



    phurtado
    lunes, 8 de agosto de 2011 10:08
  • Hola,

    Una cosa que se me ocurre puede ser que el teléfono en Configuración->Mapas, tenga desactivado usar mi ubicación y en Systema->ubicación también este desactivado.

    Revisa esto en el terminal.

     

    Una cosa del código no le veo mucho sentido a esto

     pin.Content = image;
         
         pin.Content = new Rectangle()
         {
         Fill = image,
    
         StrokeThickness = 1,
         Height = m.altura,
         Width = m.largo 
         
    
         
         
    
         };
    
    


    primero asignas image a Content  y después vuelves a cambiar el Content

     

    Saludos,


    phurtado
    lunes, 8 de agosto de 2011 10:21
  • Hola Pedro,

     

    El GPS esta habilitado en el telefono.

    El ping.content uno es la imagen y el otro es el formato de donde va a salir la información. Si pongo Eclipe la image sale dentro del eclipse

     

    Si pongo una cordenada  a mano no falla, es un poco raro. Estube mirando el xml y los valores estan bien, no tengo ninguno con más de 90.000

     

    La mensaje del fallo sale muy deprisa en el telefono: Pone que latitude tiene que ser de -90 a 90

     

    Hay alguna forma de dejar la pantalla del fallo mas tiempo?

     

     

    muchas gracias por aguentarme.

     

     

    lunes, 8 de agosto de 2011 10:44
  • Para probar, saque los decimales de la coordenada en el XML y me funciono.

    Es posible que al converter a double que cambie los PUNTOS por COMA?

     

    Voy a probar con un decimal a ver que pasa.

    lunes, 8 de agosto de 2011 10:54
  • Con un decimal ya no me funciona.
    lunes, 8 de agosto de 2011 10:58
  • Hola,

     

    El mensaje que te sale es este

     

    The value of the parameter must be from -90.0 to 90.0.

    Parameter name: Latitude


     

    pasa el xml ,la clase metro y la lectura del xml tal como las tienes y en un minuto vemos cual es el error :)

     

    Hay alguna forma de dejar la pantalla del fallo mas tiempo?

    En un principio la pantalla se debería de quedar esperando el aceptar el MessageBox, has introducido las lineas de código que te pase para controlar la excepción.

     

     

    muchas gracias por aguentarme. Esto siempre es un placer :)

    Saludos,


    phurtado
    lunes, 8 de agosto de 2011 11:06
  • Pues ya sabes lo que es.

     

    Saludos,


    phurtado
    lunes, 8 de agosto de 2011 11:11
  • Encontre el problema pero no la solución.

     

    Lo que hice fue imprimir los valores en el emulador y todo perfecto y luego en el telefono con esta linea:   MessageBox.Show(m.latitude + "   log"  + m.longitude);

     

    Hay valores que viene sin PUNTO y otros con COMAS.

     

    No entiendo porque el funcionamiento es distinto entre los dos.

     

    Algunos valores que imprime el telefono:

     

    4048172             - 3667095

    4,023245454E + 15

     

    lunes, 8 de agosto de 2011 11:11
  • Hola,

    Es posible que al converter a double que cambie los PUNTOS por COMA?

     

    Si prueba a hacer las conversiones con esto pero ten en cuenta cuando latitude esté en el Xml de está forma <latitude></latitude> esto te provocará un exception.

    Double.Parse("<Cadena>",System.Globalization.CultureInfo.InvariantCulture);

    "<Cadena>" es  tu valor,

    Saludos,


    phurtado
    lunes, 8 de agosto de 2011 11:17
  • Hola Pasa el Xml

    y lo solucionamos rapido,

     

    Saludos,

     


    phurtado
    lunes, 8 de agosto de 2011 11:18
  • <?xml version="1.0" encoding="utf-8" ?>
    <metro>
     <lineas>
      <id>1</id>
      <nombre>Pinar de Chamartín</nombre>
      <conexion>mapa/pinar_chamartin_1.png</conexion>
      <latitude>40.48172</latitude>
      <longitude>-3.667095</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
    
     <lineas>
      <id>1</id>
      <nombre>Bambú</nombre>
      <conexion>mapa/bambu_l1.png</conexion>
      <latitude>40.476871</latitude>
      <longitude>-3.6762842</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Chamartín</nombre>
      <conexion>mapa/chamartin_1.png</conexion>
      <latitude>40.4717009</latitude>
      <longitude>-3.6822738</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Plaza de Castilla </nombre>
      <conexion>Images/gps.png</conexion>
      <latitude>40.4656671</latitude>
      <longitude>-3.6890328</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Valdeacederas</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.463912</latitude>
      <longitude>-3.6957711</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Tetuán</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.4599439</latitude>
      <longitude>-3.6990748</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Estrecho</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.453715</latitude>
      <longitude>-3.702938</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Alvarado</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.4503229</latitude>
      <longitude>-3.7031519</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Cuatro Caminos</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.446653</latitude>
      <longitude>-3.7037528</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Ríos Rosas</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.44195164950461</latitude>
      <longitude>-3.701561385841279</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Iglesia</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.43388901504456</latitude>
      <longitude>-3.698299377987906</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Menéndez Pelayo</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.40437623281279</latitude>
      <longitude>-3.680871267140562</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Pacífico</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.40121476344925</latitude>
      <longitude>-3.674603739144906</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Puente de Vallecas </nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.3976360890995</latitude>
      <longitude>-3.668037691476429</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Nueva Numancia</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.39516849050746</latitude>
      <longitude>-3.663295545938099</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Portazgo</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.392275892258056</latitude>
      <longitude>-3.657695093515003</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Buenos Aires</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.391818294711335</latitude>
      <longitude>-3.654004373910671</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
    
     <lineas>
      <id>1</id>
      <nombre>Alto del Arenal</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.39015130592422</latitude>
      <longitude>-3.6452281860135427</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Miguel Hernández  </nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.38673548431696</latitude>
      <longitude>-3.6401427177209866</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Sierra de Guadalupe</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.382241594546976</latitude>
      <longitude>-3.624924115899244</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Villa de Vallecas </nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.37986190312005</latitude>
      <longitude>-3.621773861410733</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Congosto</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.37195376236266</latitude>
      <longitude>-3.6187037950856316</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>La Gavia</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.36950157101558</latitude>
      <longitude>-3.6117944246632683</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Las Suertes</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.36345245086635</latitude>
      <longitude>-3.5993489748342267</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
     <lineas>
      <id>1</id>
      <nombre>Valdecarros</nombre>
      <conexion>1,4,ml1</conexion>
      <latitude>40.36021513114783</latitude>
      <longitude>-3.5927829271657097</longitude>
      <largo>131</largo>
      <altura>40</altura>
     </lineas>
    </metro>
    
     No me deja poner todo de una sola vez, sigo en el proximo...
    lunes, 8 de agosto de 2011 11:20
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Media.Imaging;
    using Microsoft.Phone.Controls;
    using Microsoft.Phone.Controls.Maps;
    using System.Device.Location;
    using System.Xml.Linq;
    namespace METRO
    {
      public partial class mapa5 : PhoneApplicationPage
      {
        private RotateTransform _transform;
        private GeoCoordinateWatcher _watcher;
        public mapa5()
        {
         
          InitializeComponent();
          _watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
          _watcher.MovementThreshold = 1; 
          _watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(OnStatusChanged);
          _watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(OnPositionChanged);
          _watcher.Start();
          Marcas();
          
        }
        private double ConvertDouble(string Valor)
        {
          double a = 0;
          if (Valor != null)
          {
            double.TryParse(Valor, out a);
          }
          return a;
        }
        void Marcas()
        {
          
         
          XDocument xmlSource = XDocument.Load("metro.xml");
          List<metro> data = (from item in xmlSource.Descendants("lineas")
                    select new metro
                    {
                      id = item.Element("id").Value,
                      nombre = item.Element("nombre").Value,
                      conexion = item.Element("conexion").Value,
                      largo = Convert.ToInt16(item.Element("largo").Value),
                      altura = Convert.ToInt16(item.Element("altura").Value),
                      latitude = ConvertDouble(item.Element("latitude").Value),
                      longitude = ConvertDouble(item.Element("longitude").Value)
                    }).ToList();
    
       
     try 
       {
         if (data != null)
         {
    
           List<metro> listametro = new List<metro>();
    
           foreach (metro m in data)
           {
    
    
             Pushpin pin = new Pushpin();
             pin.Background = new SolidColorBrush(Colors.Brown);
    
    
    
             pin.Location = new GeoCoordinate(40.476871,-3);
    
             MessageBox.Show(m.latitude + "  log" + m.longitude);
             ImageBrush image = new ImageBrush()
             {
               ImageSource = new System.Windows.Media.Imaging.BitmapImage
                        (new Uri(m.conexion, UriKind.Relative))
             };
             pin.Content = image;
    
             pin.Content = new Rectangle()
             {
               Fill = image,
    
               StrokeThickness = 1,
               Height = m.altura,
               Width = m.largo
    
    
    
    
    
             };
             // pin.Content = image;
             BingMap.Children.Add(pin);
    
    
    
    
    
           }
           
    
         }
    
    
          }
     catch (Exception ex)
     {
       MessageBox.Show(string.Format("{0}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace));
       
     }
    
        }
    
    
    
        
    
        void OnStatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
        {
          if (e.Status == GeoPositionStatus.Disabled)
            MessageBox.Show("El servicio de ubicación está desactivado");
          else if (e.Status == GeoPositionStatus.NoData)
            MessageBox.Show("No hay datos del GPS, Inténtelo más tarde.");
        }
    
        void OnPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
        {
          
          Pin.Location = new GeoCoordinate(e.Position.Location.Latitude, e.Position.Location.Longitude);
          BingMap.Center = new GeoCoordinate(e.Position.Location.Latitude, e.Position.Location.Longitude);
    
          
          if (!double.IsNaN(e.Position.Location.Course))
          {
            if (_transform == null)
            {
              foreach (DependencyObject visual in GetVisualElements(Pin))
              {
                if (visual is Grid)
                {
                  _transform = (visual as Grid).RenderTransform as RotateTransform;
                  break;
                }
              }
            }
    
            if (_transform != null)
              _transform.Angle = e.Position.Location.Course;
          }
        }
    
        
    
    
    
        public class metro
        {
    
          public string nombre { get; set; }
          public string id { get; set; }
          public string conexion { get; set; }
          public double latitude { get; set; }
          public double longitude { get; set; }
          public int altura { get; set; }
          public int largo { get; set; }
        }
    
        private IEnumerable<DependencyObject> GetVisualElements(DependencyObject root)
        {
          int count = VisualTreeHelper.GetChildrenCount(root);
    
          for (int i = 0; i < count; i++)
          {
            var child = VisualTreeHelper.GetChild(root, i);
            yield return child;
    
            foreach (var descendant in GetVisualElements(child))
            {
              yield return descendant;
            }
          }
        }
      }
    }
    

    <phone:PhoneApplicationPage 
      x:Class="METRO.mapa5"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
      xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
      FontFamily="{StaticResource PhoneFontFamilyNormal}"
      FontSize="{StaticResource PhoneFontSizeNormal}"
      Foreground="{StaticResource PhoneForegroundBrush}"
      SupportedOrientations="PortraitOrLandscape" Orientation="Portrait"
      shell:SystemTray.IsVisible="False"
      xmlns:maps="clr-namespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps">
    
      <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.Resources>
          <ControlTemplate x:Key="PushpinTemplate" TargetType="maps:Pushpin">
            <Grid RenderTransformOrigin="0.5,0.5" DataContext="{Binding}">
              <Grid.RenderTransform>
                <RotateTransform />
              </Grid.RenderTransform>
              
                <Image Source="/METRO;component/Images/gps.png" Stretch="None" />
              <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
            </Grid>
          </ControlTemplate>
        </Grid.Resources>
    
        
        <Grid x:Name="ContentPanel">
          <maps:Map x:Name="BingMap" CopyrightVisibility="Collapsed" ZoomBarVisibility="Collapsed" ZoomLevel="3" Center="40.4202995300293 ,-3.70577502250671" Mode="Aerial"
            CredentialsProvider="">
    
            
                <maps:Pushpin x:Name="Pin" PositionOrigin="0.5,0.5" Template="{StaticResource PushpinTemplate}" />
    
           
          </maps:Map>
          
        </Grid>
      </Grid>
    
    </phone:PhoneApplicationPage>
    

    lunes, 8 de agosto de 2011 11:21
  • Hola,

     

    Cambia esto

     

     List<metro> data = (from item in xmlSource.Descendants("lineas")
            select new metro
            {
             id = item.Element("id").Value,
             nombre = item.Element("nombre").Value,
             conexion = item.Element("conexion").Value,
             largo = Convert.ToInt16(item.Element("largo").Value),
             altura = Convert.ToInt16(item.Element("altura").Value),
             latitude = ConvertDouble(item.Element("latitude").Value),
             longitude = ConvertDouble(item.Element("longitude").Value)
            }).ToList();
    
    

     

    por esto 

     

     

    List<metro> data = (from linea in xmlSource.Descendants("lineas")
                select new metro
                {
                  id = int.Parse(linea.Element("id").Value),
                  nombre = linea.Element("nombre").Value,
                  conexion = linea.Element("conexion").Value,
                  latitude = double.Parse(linea.Element("latitude").Value,System.Globalization.CultureInfo.InvariantCulture),
                  longitude = double.Parse(linea.Element("longitude").Value,System.Globalization.CultureInfo.InvariantCulture),
                  altura = int.Parse(linea.Element("altura").Value),
                  largo = int.Parse(linea.Element("largo").Value)
    
                }).ToList();
    

     


    Con esto te va a funcionar, pero piensa que si un xml se graba así

     

    <id>1</id>
     <nombre>Villa de Vallecas </nombre>
     <conexion>1,4,ml1</conexion>
     <latitude></latitude>
     <longitude></longitude>
     <largo></largo>
     <altura></altura>
    


    Se te van a producir errores en 

     

     latitude = double.Parse(linea.Element("latitude").Value,System.Globalization.CultureInfo.InvariantCulture),
                  longitude = double.Parse(linea.Element("longitude").Value,System.Globalization.CultureInfo.InvariantCulture),
                  altura = int.Parse(linea.Element("altura").Value),
                  largo = int.Parse(linea.Element("largo").Value)
    


    Te recomiendo que crees dos metodos tal que así que controlan que la cadena que pasas es vacia o nula.

     

    //Conversor a Double 
        private double ConvertDouble(string Valor)
        {
          double a = 0;
          if (!string.IsNullOrEmpty(Valor))
          {
            if (double.TryParse(Valor, out a))
            {
              return double.Parse(Valor, System.Globalization.CultureInfo.InvariantCulture);
            }
          }
          return a;
        }
        //Conversor Int32
        private int ConvertInt(string Valor)
        {
          int a = 0;
          if (!string.IsNullOrEmpty(Valor))
          {
            int.TryParse(Valor, out a);
            
          }
          return a;
        }
    
    

    y entonces el Xml lo leas de la siguiente forma

     

    List<metro> data = (from linea in xmlSource.Descendants("lineas")
                select new metro
                {
                  id = int.Parse(linea.Element("id").Value),
                  nombre = linea.Element("nombre").Value,
                  conexion = linea.Element("conexion").Value,
                  latitude = ConvertDouble(linea.Element("latitude").Value),
                  longitude = ConvertDouble(linea.Element("longitude").Value),
                  altura = ConvertInt(linea.Element("altura").Value),
                  largo = ConvertInt(linea.Element("largo").Value)
    
                }).ToList();
    

    Ojo esto no solamente es aplicable a Wp7, sino a todo .Net como ya te comente arriba.

     

    Saludos,


    phurtado
    • Marcado como respuesta ElbrinnerMVP lunes, 8 de agosto de 2011 12:06
    lunes, 8 de agosto de 2011 11:45
  •  

    Muchas gracias, ya me funciona. Pero sigo sin entender porque los valores se imprimía sin los PUNTOS.

     

    Voy a buscar un curso de C# que hay cosas simples que me costa mucha.

     

    Me pareció curioso cuando comente una parte de fallo y tu ya tenías la pantalla y todo con el mismo fallo.

     

    un saludo y muchas gracias

    lunes, 8 de agosto de 2011 12:27
  • Hola:

     

    No busques, pero estudia :), mira esto 

     

     

    string SeparadorEspaña = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    
     string SeparadorInvariant = System.Globalization.CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator;
    

     


    Aqui puedes ver la diferencia y al ver como tenias grabado el xml, fue facil de deducir :), Piensa que Microsoft está en RedMond y no en Madrid, es normal que tiren para casa.

     

    Podría ser que el emulador tuviese una configuración y el Teléfono otra, por eso apunte a ConvertToDouble y basandome en este hilo vi que los cimientos de la casa eran debiles, porque en un principio en la clase Metro tenías latitude y longitude como string, mala cosa :)

    http://social.msdn.microsoft.com/Forums/es-ES/windowsphone7/thread/51351efd-53a1-48fb-a5da-67ec3ac214b4

    Me pareció curioso cuando comente una parte de fallo y tu ya tenías la pantalla y todo con el mismo fallo.

     

    Te prometo que no soy mago en un Proyecto escribí esto 

     

    try
       {
        GeoCoordinate g = new GeoCoordinate(15012000, 10);
        Pushpin p = new Pushpin();
        p.Location = g;
       }
       catch (Exception j)
       {
        MessageBox.Show(string.Format("{0}{1}{2}",j.Message,Environment.NewLine,j.StackTrace));
       }
    


     

    y vi el exception que se producía, cosa que no sabía puesto que yo normalmente en las ciudades me pierdo:), imagina como voy de latitudes y longitudes.

    El "15012000" es la fecha de nacimiento de uno de mis queridos hijos, pero como te habrán dicho muchas veces la "experiencia es un grado" y eso no se adquiere estudiando, sino a base de años.

     

    Desde el principio te recomende MVVM  y veo que sigue sin aparecer en tu código, termina la app pero si quieres estudiar empieza por esto, el resto son detalles de poca importancía y que mas tarde o más temprano se solucionan, lo otro no.

     

    Saludos,


    phurtado
    lunes, 8 de agosto de 2011 13:47