J'ai un bouton avec une image d'arrière-plan fixe et j'aimerais afficher une petite image de superposition par-dessus. L'image de superposition à choisir dépend d'une propriété de dépendance ( LapCounterPingStatus
) du modèle de vue correspondant.
Voici ce que j'ai obtenu jusqu'à présent:
<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>
Parties pertinentes de mon modèle de vue
public class ConfigurationViewModel
{
public enum PingStatus { PING_UNKNOWN, PING_SUCCESS, PING_FAILURE };
public PingStatus LapCounterPingStatus
{
get { return _lapCounterPingStatus; }
set
{
_lapCounterPingStatus = value;
RaisePropertyChanged(LapCounterPingStatusPropertyName);
}
}
}
À l'heure actuelle, aucune image de superposition n'est affichée. Qu'est-ce qui ne va pas?
METTRE À JOUR
La fenêtre de trace de mon IDE s'affiche System.ArgumentException
et System.FormatException
. La source du problème pourrait-elle être un type d'énumération inconnu dans PingStatus
le XAML?
Réponses:
Vous avez besoin de 2 choses pour que cela fonctionne:
1 - Ajoutez une
xmlns
référence dans l'élément racine de votre fichier XAML, à l'espace de noms où votre Enum est défini:2 - dans la
Value
propriété duDataTrigger
, utilisez le{x:Static}
formulaire:Notez que le type Enum doit être précédé du préfixe xmlns que vous avez défini ci-dessus.
Éditer:
Si votre Enum est déclaré dans une classe, vous devez utiliser la syntaxe:
{x:Static namespace:ClassName+EnumName.EnumValue}
par exemple:
{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}
la source
xmlns
comme ceci:xmlns:local="clr-namespace:MyCompany.Testbench"
et le déclencheur comme ça<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static local:PingStatus.PING_UNKNOWN}">
. Non, j'obtiens l'erreurCannot find the type 'PingStatus'
.enum PingStatus
est défini à l'intérieur de la classeMyCompany.TestBench.ConfigurationViewModel
. Dois-je ajouter le nom de la classe quelque part?Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolder
Exemple de travail complet pour WPF + MVVM.
Testé sur MSVC 2017.
Dans la vue:
Si vous utilisez ReSharper, et si le DataContext est correctement configuré, il y aura IntelliSense quand vous frappez la
.
suiteStatusIcon
, ce qu'il affiche les propriétés de l'ENUM qui sontDebug
,Info
,Warning
ouError
.Si vous utilisez ReSharper, il suggérera la mise à jour suivante de l'espace de noms dans l'en-tête du fichier XAML (c'est bien comme ça):
Et le VieModel:
Nous utilisons également
Fody
pour la liaison automatique.la source