gatilhos WPF que afetam os valores definido no código, não XAML
Pergunta
No meu aplicativo eu tenho botões de alternância que tem três estados possíveis; "Desmarcado", "verificado", e "Anteriormente Usado". Quando o usuário chega a essa tela particular, alguns dos botões de alternância vai estar no estado "Anteriormente usado" para mostrar o trabalho tem sido feito. Ao clicar em um botão de alternância (não importa o estado atual) vai colocá-lo para o estado "verificado". Apenas um desses botões de alternância pode ser verificado em um tempo. Os diferentes estados são indicados pelo brilho externo de cor diferente, ou nenhum brilho em tudo.
Para definir o brilho externo para o estado "verificado" Eu uso um disparador em IsChecked euqals verdade.
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect Color="Salmon" BlurRadius="40" ShadowDepth="0" Opacity="1.0"></DropShadowEffect>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
Para o estado "Anteriormente Usado" Eu aplicar o brilho externo no código, não marcação. Eu tenho que fazer isso porque determinar se o botão deve estar neste estado é feito verificando os valores em uma lista.
if (mExistingViews.Contains(mViews[i].LocalizedName))
{
DropShadowEffect dse = new DropShadowEffect();
dse.ShadowDepth = 0;
dse.BlurRadius = 20;
dse.Opacity = 1.0;
dse.Color = Colors.Yellow;
mViewButtons[i].Effect = dse;
}
No entanto, quando um botão de alternância é clicado quando no estado "Anteriormente Usado", o gatilho não parece ter qualquer efeito. O brilho externo não muda.
O que estou fazendo de errado? Será um gatilho não efeito algo que não foi definido em XAML?
Solução
Depois de definir a DropShadowEffect
na Button
, você está definindo o valor local de propriedade Button
do Effect
, que é um DependencyProperty
(Button.EffectProperty
). O valor local substitui qualquer outro valor possível até que sejam retirados assim:
button1.ClearValue( Button.EffectProperty );
No entanto, isso só faz o funcionamento de um pouco mais complicado, porque você também tem que ter certeza que você limpá-la se foi definido antes e não foi liberado ainda.
Em vez disso, você pode criar um PreviouslyUsed
AttachedProperty para colocar no ToggleButton
s e uso Bindings
assim que receber o seu valor um pouco mais automagicamente. Em seguida, referem-se a este valor AttachedProperty em seus gatilhos e você terá uma sombra da gota para PreviouslyUsed
, e outro para IsChecked
.
A parte que você vai ter que conectar-se é a ligação, e você provavelmente vai ter que usar um em algum lugar IValueConverter
para transformar mViews[i].LocalizedName
em um true
ou false
para PreviouslyUsed
.
Infelizmente, eu não sei o suficiente sobre a sua configuração com mViews
e tal para oferecer mais conselhos sobre isso. Eu não sei se o seu ToggleButtons
fazem parte de ligação de dados ou não. Eu suspeito que eles não são, como você parece estar repetindo uma série deles. Se você limita seus objetos mViews
ao ItemsSource
de um ListBox
, por exemplo, você poderia criar um DataTemplate
que gera o ToggleButtons
com o AttachedProperty já em vigor. Isso também simplificar a sua situação IsChecked
ligando-se ou não esse item é selecionado no ListBox
, e então o ListBox
cuida de certificando-se de que apenas um é selecionado.