none
Comparar colores RRS feed

  • Pregunta

  • Hola, me surgió el siguiente problemilla, tengo que comparar dos colores, y el caso es que parece q esta todo bien, pues en ambos objetos comparados me da el mismo valor, pero no entra en el if, yo no se lo q hago mal.

    Aqui el ejemplo:

    private

     

    void MouseUp(object sender, MouseButtonEventArgs

    e)

    {

     

     

       if (SolidColorBrush.Equals(((Ellipse)sender).Fill, Colors.Green))
       {
          /*No entra a pesar de que los dos valores son iguales #FF008000*/
      

    }

     

      if (((Ellipse)sender).Fill.Equals(Colors.Green))
      {
          /* y en este caso tampoco entra*/

     

    }

    }

    Alguien sabe porque puede ser?? o que es lo que hago mal???

    viernes, 13 de mayo de 2011 11:01

Respuestas

  • Mchìsimas gracias a todos por la ayuda, la solución que he llevado a cabo a sido la siguiente:

    private

     

     

    void MouseUp(object sender,MouseButtonEventArgs e)

    {

     if(Color.Equals(((SolidColorBrush)((Ellipse)sender).Fill).Color, Colors.Green))

     {

           //Si que Entra

     }

    }

    Con un doble cast y todo jeje...

     

     



    • Marcado como respuesta budurex lunes, 16 de mayo de 2011 9:13
    viernes, 13 de mayo de 2011 14:03

Todas las respuestas

  •  

    Bueno en este caso, si los comparo como texto si que entra, pero creo que lo suyo sea comparar los objetos no??

     

    Me parece un poco ñapa, aunque funciona perfect:

    if (((Ellipse)sender).Fill.ToString().CompareTo(Colors

    .Green.ToString())==0)

    {

        borrar =

    "si"

    ;

    }

    Creo que no sería la mejor manera de comparar colores no creeis???

    viernes, 13 de mayo de 2011 11:07
  • Saludos... lo que sucede es que estás comparando un SolidColorBrush contra un Color, que en ningún caso serán iguales.

    Debes extraer el Color del SolidColorBrush para poder hacer la comparación:

    Ellipse MiElipse = new Ellipse();
    MiElipse.Fill = new SolidColorBrush(Colors.Green);
    
    if (SolidColorBrush.Equals(MiElipse.Fill, Colors.Green))
    {
    	// aqui no entra.
    }
    
    if (Color.Equals(
    	((SolidColorBrush)MiElipse.Fill).Color, Colors.Green))
    {
    	// Aqui si entra.
    }
    
    

    Hay que hacer el Cast a SolidColorBrush pues la propiedad Fill puede ser otro tipo de brocha.


    Nestor Arturo Fernandez Ricaurte
    viernes, 13 de mayo de 2011 13:06
  • Hola Budurex.

    No.

    No puedes hacer eso de la forma que lo haces, existe un grave problema con los lenguajes de alto nivel y es que se obvia muchas cosas que no son lo que parecen.

    Piensa en C++ o ASM:

    tienes un objeto de una clase en la direccion de memoria simplificada 0xAAAA y otro (la enumeracion de color verde) en 0xBBBB.

    Tu preguntas que si 0xAAAA == 0xBBBB (no son iguales).

    En c# aunque no lo parezca todas las clases con valores por referencia, esto quiere decir que se trabaja con los punteros de las clases aunque no se indique explicitamente como en c++.

    El problema de esto es que existe una escepcion y son las cadenas, los strings siempre se hacen una copia, por eso se pueden comparar con el operador ==

    Pero es el unico objeto que vale para eso, todos los demas objetos (por defecto) de clases son referencias (al igual que todos los objetos de estructuras son valores, como todos los tipos primitivos, int. bool, etc.).


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    viernes, 13 de mayo de 2011 13:08
  • Adendum... ya que Color es una estructura sencilla, esto también funciona:

    if (((SolidColorBrush)MiElipse.Fill).Color == Colors.Green)
    {
    	// Aqui también entra.
    }
    
    

    Nestor Arturo Fernandez Ricaurte
    viernes, 13 de mayo de 2011 13:29
  • Mchìsimas gracias a todos por la ayuda, la solución que he llevado a cabo a sido la siguiente:

    private

     

     

    void MouseUp(object sender,MouseButtonEventArgs e)

    {

     if(Color.Equals(((SolidColorBrush)((Ellipse)sender).Fill).Color, Colors.Green))

     {

           //Si que Entra

     }

    }

    Con un doble cast y todo jeje...

     

     



    • Marcado como respuesta budurex lunes, 16 de mayo de 2011 9:13
    viernes, 13 de mayo de 2011 14:03