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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top