Usuário com melhor resposta
Binding em cores...

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.
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
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
-
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
-
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.