locked
Binding no XAML altera comportamento da propriedade TEXT RRS feed

  • Pergunta

  • Pessoal,

    Estou utilizando código XAML para exibir a imagem em vez de utilizar o arquivo PNG.

    Usando este código XAML a imagem aparece normalmente

    <TextBlock Text="&#x1F68D;" FontFamily="Segoe UI Symbol" FontSize="32" HorizontalAlignment="Center"></TextBlock>

    Agora se eu trouxer a informação do banco de dados e utilizar o Binding no XAML, conforme o código abaixo, a imagem não aparece e sim a string.

    <TextBlock Text="{Binding passageiroStatusXAML}" FontFamily="Segoe UI Symbol" FontSize="16" HorizontalAlignment="Center"></TextBlock>

    No banco é armazenada como String e não recebe nenhum tratamento. O código da imagem é exatamente este exibido. Alguma sugestão?

    Grato.


    Andrey Kurka (MCC) | Federal Case | @federalcaseinfo

    sexta-feira, 27 de setembro de 2013 01:40

Respostas

  • A notação &#xhhhh; é apenas para XML (e, quando setamos um valor string em código, não é isso que o compilador espera).

    Em C#, as strings são em UTF-16, o que nos permite utilizar 65536 símbolos diferentes: de 0x0000 a 0xFFFF (para escrever, por exemplo, uma carinha feliz com a fonte Segoe UI Symbol, basta fazer "\uE170")

    MAS... o código que você está tentando inserir vai além dos 16-bit e isso é muito complicado.

    Para exibir este caractere, precisamos da string "\uD83D\uDE8D":

    TextBlock.Text = "\uD83D\uDE8D";

    O problema é a matemática para transformar este 0x1f68d neste código aí em cima. Por sorte (na verdade competência extrema do time .net), existe uma função que faz este cálculo (você pode ver a implementação deste cálculo aqui: http://www.russellcottrell.com/greek/utilities/SurrogatePairCalculator.htm)

    var xmlCode = "&#x1F68D;";
    var uintValue = int.Parse(xmlCode.Substring(3, 5), System.Globalization.NumberStyles.HexNumber);
    
    Test.DataContext = new Tuple<string, string>(char.ConvertFromUtf32(uintValue), "&#x1F68D;");

    O que eu fiz aqui foi fazer o binding de um TextBlock com um objeto qualquer.

    O segredo é fazer um parsing do valor unicode (que é 1f68d, em hexa), feito através da segunda linha acima.

    Tendo este valor em mãos, é possivel utilizar a função char.ConvertFromUtf32(valor) para se obter o caracter desejado.

    Aconselho você construir um converter para isso (e ter mais cuidado do que eu na hora do parsing, pois este código é susceptível a erros)

    Espero que tenha ajudado.


    sábado, 12 de outubro de 2013 00:37

Todas as Respostas

  • Passando aqui para manter o post na primeira página... Ainda aguardando uma resposta...

    Andrey Kurka (MCC) | Federal Case | @federalcaseinfo

    sábado, 5 de outubro de 2013 20:38
  • A notação &#xhhhh; é apenas para XML (e, quando setamos um valor string em código, não é isso que o compilador espera).

    Em C#, as strings são em UTF-16, o que nos permite utilizar 65536 símbolos diferentes: de 0x0000 a 0xFFFF (para escrever, por exemplo, uma carinha feliz com a fonte Segoe UI Symbol, basta fazer "\uE170")

    MAS... o código que você está tentando inserir vai além dos 16-bit e isso é muito complicado.

    Para exibir este caractere, precisamos da string "\uD83D\uDE8D":

    TextBlock.Text = "\uD83D\uDE8D";

    O problema é a matemática para transformar este 0x1f68d neste código aí em cima. Por sorte (na verdade competência extrema do time .net), existe uma função que faz este cálculo (você pode ver a implementação deste cálculo aqui: http://www.russellcottrell.com/greek/utilities/SurrogatePairCalculator.htm)

    var xmlCode = "&#x1F68D;";
    var uintValue = int.Parse(xmlCode.Substring(3, 5), System.Globalization.NumberStyles.HexNumber);
    
    Test.DataContext = new Tuple<string, string>(char.ConvertFromUtf32(uintValue), "&#x1F68D;");

    O que eu fiz aqui foi fazer o binding de um TextBlock com um objeto qualquer.

    O segredo é fazer um parsing do valor unicode (que é 1f68d, em hexa), feito através da segunda linha acima.

    Tendo este valor em mãos, é possivel utilizar a função char.ConvertFromUtf32(valor) para se obter o caracter desejado.

    Aconselho você construir um converter para isso (e ter mais cuidado do que eu na hora do parsing, pois este código é susceptível a erros)

    Espero que tenha ajudado.


    sábado, 12 de outubro de 2013 00:37
  • J.C. novamente obrigado...

    Vou fazer os testes, implementar o converter, posto aqui o resultado e marco sua resposta.


    Andrey Kurka (MCC) | Federal Case | @federalcaseinfo

    sábado, 12 de outubro de 2013 07:08
  • J.C.

    Para fins didáticos vale à pena, inclusive levei esta situação para a sala de aula, mas no meu aplicativo ficou muito mais simples trabalhar com as imagens em PNG direto.

    Estou marcando como resposta porque funciona mesmo.

    Obrigado pela ajuda!

    Abraço


    Andrey Kurka (MCC) | Federal Case | @federalcaseinfo

    terça-feira, 15 de outubro de 2013 00:18