Eu tenho um botão com uma imagem de plano de fundo fixa e gostaria de mostrar uma pequena imagem de sobreposição em cima dele. A imagem de sobreposição a ser escolhida depende de uma propriedade de dependência ( LapCounterPingStatus
) do modelo de visualização de acordo.
Isso é o que eu tenho até agora:
<Button>
<Grid>
<Image Stretch="None"> <!-- Background Image -->
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="/Images/Pingn.png"/>
</Style>
</Image.Style>
</Image>
<Image Stretch="None" Panel.ZIndex="1"> <!-- Small Overlay Image -->
<Image.Style>
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_UNKNOWN">
<Setter Property="Source" Value="/Images/RefreshOverlayn.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_FAILURE">
<Setter Property="Source" Value="/Images/ErrorOverlayn.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="PingStatus.PING_SUCCESS">
<Setter Property="Source" Value="/Images/CheckmarkOverlayn.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</Grid>
</Button>
Partes relevantes do meu modelo de visão
public class ConfigurationViewModel
{
public enum PingStatus { PING_UNKNOWN, PING_SUCCESS, PING_FAILURE };
public PingStatus LapCounterPingStatus
{
get { return _lapCounterPingStatus; }
set
{
_lapCounterPingStatus = value;
RaisePropertyChanged(LapCounterPingStatusPropertyName);
}
}
}
No momento, nenhuma imagem de sobreposição é exibida. O que pode estar errado?
ATUALIZAR
A janela de rastreamento do meu IDE está sendo exibida System.ArgumentException
e System.FormatException
. A origem do problema pode ser um tipo desconhecido de enumeração PingStatus
no XAML?
Respostas:
Você precisa de 2 coisas para fazer isso funcionar:
1 - Adicione uma
xmlns
referência no elemento raiz de seu arquivo XAML, ao namespace onde seu Enum está definido:2 - na
Value
propriedade daDataTrigger
, utilize o{x:Static}
formulário:Observe que o tipo Enum deve ser prefixado com o prefixo xmlns definido acima.
Editar:
Se o seu Enum for declarado dentro de uma classe, você precisará usar a sintaxe:
{x:Static namespace:ClassName+EnumName.EnumValue}
por exemplo:
{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}
fonte
xmlns
assim:xmlns:local="clr-namespace:MyCompany.Testbench"
e o gatilho assim<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static local:PingStatus.PING_UNKNOWN}">
. Não, recebo o erroCannot find the type 'PingStatus'
.enum PingStatus
é definido dentro da classeMyCompany.TestBench.ConfigurationViewModel
. Eu tenho que adicionar o nome da classe em algum lugar?Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolder
Exemplo completo trabalhado para WPF + MVVM.
Testado em MSVC 2017.
Na vista:
Se estiver usando ReSharper, e se o DataContext está configurado corretamente, haverá intellisense quando você bate o
.
depoisStatusIcon
, ou seja, ele vai mostrar as propriedades da enumeração que sãoDebug
,Info
,Warning
ouError
.Se estiver usando ReSharper, ele irá sugerir a seguinte atualização para o namespace no cabeçalho do arquivo XAML (é bom assim):
E o VieModel:
Também usamos
Fody
para vinculação automática.fonte