WPF ListViewItem perdeu evento de foco - Como chegar no evento?
-
19-08-2019 - |
Pergunta
Eu tenho um listview que você selecionar uma linha / item. Isso está ligado a um DataTrigger que exibe uma imagem na linha. A imagem só deve ser exibida quando a linha é selecionada.
Esta parte funciona bem, no entanto, quando você mover o foco para outra coisa, como uma caixa de texto, ou um messagebox for exibido, o listviewitem perde o foco ou seja o destaque na linha não é mais exibido. O problema é que a minha imagem ainda permanece. Deve ser escondido / desmoronou quando o listview perde o foco ... Ele funciona muito bem se você selecionar um diferente ponto / linha na listview.
alguém pode ajudar sobre isso, por favor?
<Style x:Key="deleteImageStyle" TargetType="{x:Type Image}">
<Setter Property="Source" Value="Resources/iconDelete.png" />
<Setter Property="Margin" Value="0,2,5,0" />
<Setter Property="Height" Value="16" />
<Setter Property="Width" Value="16" />
<Setter Property="HorizontalAlignment" Value="Right" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="Cursor" Value="Hand" />
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Visibility" Value="Hidden" />
</Trigger>
</Style.Triggers>
</Style>
Saudações
TravisPUK
Solução
Eu acho que você está confundindo IsSelected e IsFocused.
Experiência com ligação seus gatilhos para IsFocused em vez de IsSelected para obter o resultado desejado.
Se bem entendi, você só deseja que a imagem a ser visível se ambos IsSelected e IsFocused são verdadeiras, caso contrário escondido.
Uma maneira de fazer isso é definir a visibilidade padrão para Visível, e em seguida, adicione dois gatilhos que definir a visibilidade como Oculto: um gatilho para IsSelected = False, e outro gatilho para IsFocused = false
.Ou o contrário, conjunto padrão Visibilidade como Oculto, e usar um MultiTrigger com IsSelected = True e IsFocused = True para defini-la Visibilidade para Visível
Outras dicas
@Bubblewrap,
Obrigado pela informação, este muito bem tenho em torno da questão. Conforme abaixo eu tive que adicionar em ambos os cenários como o padrão parece não ter efeito ... no entanto eu não tentei o método MultiTrigger ainda, vai fazer mais tarde.
Isto é o que eu acabei com no final.
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsFocused}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsFocused}" Value="False">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Visibility" Value="Hidden" />
</Trigger>
</Style.Triggers>
Obrigado por sua ajuda, isso vai me passado o meu problema para agora. Eu acho que meu gatilho IsEnabled é provavelmente redundante agora embora.
Graças
TravisPUK