none
Binding em cores... RRS feed

  • Pergunta

  • Olá, impressionado é pouco pra definir como me sinto em relação ao WPF.

    É maravilhoso. Um dos recursos que mais me chamou a atenção é o DataBinding... sei q sempre existiu em windows forms, mas não com o tanto de recursos e inovações como é no WPF.

    É impressionante fazer as coisas mudarem simplesmente arrastando uma slidebar, ou movimentando o mouse pela tela... coisa q em winform levaria linhas e linhas de código.

    No entanto, estudando a interface do blend, quis fazer algo diferente.

    Tenho um grid em degradê que vai do verde para o amarelo. Quero q, ao arrastar uma slidebar a tonalidade do verde varie entre verde claro e verde escuro.

    Na aba de cores temos 4 estilos (RGB, CMYK, HLS e HSB).

    Fazer isso com RGB é difícil, visto q apenas mudando a intensidade da cor, de claro para escuro, dois valores do RGB são alterados em proporções diferentes.

    Então mudei para os sistemas HLS e vi q, ao mudar de claro para escuro, apenas o valor de L é alterado.

    Assim, como fazer um Binding no "L" do HLS? (no blend não tem a opção)

    O resultado final será assim: Ao movimentar o slidebar, o "L" do sistema de cores HLS será alterado.

    Alguém sabe descascar este abacaxi?


    Se a resposta foi útil, por favor marque como útil. Leia a bíblia.
    domingo, 2 de maio de 2010 13:18

Respostas

  • Cristiano (meu chará),

    Não sei se entendi muito bem a sua dúvida mas vamos lá.

    Você poderia criar um Converter que recebe um valor double entre 0.0 e 1.0, que representaria a luminosidade da cor verde, e retorna um objeto Color.

    [ValueConversion(typeof(double), typeof(Color))]
    public class GreenLightnessConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // cor verde (RGB: 0,255,0) em HSL
            double h = 120.0 / 360.0;
            double s = 1.0;
            double l = (double)value;

            // converte HSL em um objeto Color (procurar como fazer isso na internet)
            Color c = ColorFromHSL(h, s, l);

            // retorna a cor
            return c;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    E então fazer com que o gradiente realize DataBinding com o valor do Slider, que poderia variar de 0.0 a 1.0 representando a luminosidade da cor verde. O XAML ficaria da seguinte maneira:

    <Grid.Resources>            
        <local:GreenLightnessConverter x:Key="colorConverter " />            
    </Grid.Resources>        
            
    <Grid.Background>
        <LinearGradientBrush>
            <GradientStop Color="{Binding ElementName=seuSlider ,
                                          Path=Value,
                                          Converter={StaticResource colorConverter }}"
                          Offset="0.0" />
            <GradientStop Color="Yellow"
                          Offset="1.0" />
        </LinearGradientBrush>
    </Grid.Background>

    Espero ter sido claro.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    • Marcado como Resposta Tianodraco terça-feira, 4 de maio de 2010 11:09
    terça-feira, 4 de maio de 2010 03:42
    Moderador

Todas as Respostas

  • Cristiano, acho que entendi pouco o seu problema mas tente utilizar o datatrigger.
    • Sugerido como Resposta Thiago MDTech segunda-feira, 3 de maio de 2010 19:52
    segunda-feira, 3 de maio de 2010 19:46
  • Cristiano (meu chará),

    Não sei se entendi muito bem a sua dúvida mas vamos lá.

    Você poderia criar um Converter que recebe um valor double entre 0.0 e 1.0, que representaria a luminosidade da cor verde, e retorna um objeto Color.

    [ValueConversion(typeof(double), typeof(Color))]
    public class GreenLightnessConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            // cor verde (RGB: 0,255,0) em HSL
            double h = 120.0 / 360.0;
            double s = 1.0;
            double l = (double)value;

            // converte HSL em um objeto Color (procurar como fazer isso na internet)
            Color c = ColorFromHSL(h, s, l);

            // retorna a cor
            return c;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    E então fazer com que o gradiente realize DataBinding com o valor do Slider, que poderia variar de 0.0 a 1.0 representando a luminosidade da cor verde. O XAML ficaria da seguinte maneira:

    <Grid.Resources>            
        <local:GreenLightnessConverter x:Key="colorConverter " />            
    </Grid.Resources>        
            
    <Grid.Background>
        <LinearGradientBrush>
            <GradientStop Color="{Binding ElementName=seuSlider ,
                                          Path=Value,
                                          Converter={StaticResource colorConverter }}"
                          Offset="0.0" />
            <GradientStop Color="Yellow"
                          Offset="1.0" />
        </LinearGradientBrush>
    </Grid.Background>

    Espero ter sido claro.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    • Marcado como Resposta Tianodraco terça-feira, 4 de maio de 2010 11:09
    terça-feira, 4 de maio de 2010 03:42
    Moderador
  • Ari, chará, mais claro impossível.

    Estou dando os prieiros passos ainda no WPF... te gente q diz q é quase a mesma coisa q WindowsFor, mmas a verdade é q é muito diferente.

    Conceitos como conversao de valores eu ainda to tentando digerir, e vou conseguindo iswto aos poucos.

    Comprei o livro do ADAM NATHAN, WINDOWS PRESENTATION FUNDATION - SEM LIITES, e to esperando chegar... se Deus quiser chega nesta semana, e vou realmente me dedicar ao estudo do WPF, quero me tornar esppecialista n assunto.

    A versao q comprei é um pouco antiga, com o WPF no framework 3.0... mas acredito q vai dar pra arender bastante meso assim... as diferenças eu vou pesquisando na internet.

    Muito obrigado pela resposta, tenho certeza q vai funcionar.


    Se a resposta foi útil, por favor marque como útil. Leia a bíblia.
    terça-feira, 4 de maio de 2010 11:09