我有一个固定背景图像的按钮,想在它上面显示一个小的覆盖图像。选择哪个覆盖图像取决于相应视图模型的依赖属性(LapCounterPingStatus
)。
这是我目前得到的:
<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>
我的视图模型的相关部分
public class ConfigurationViewModel
{
public enum PingStatus { PING_UNKNOWN, PING_SUCCESS, PING_FAILURE };
public PingStatus LapCounterPingStatus
{
get { return _lapCounterPingStatus; }
set
{
_lapCounterPingStatus = value;
RaisePropertyChanged(LapCounterPingStatusPropertyName);
}
}
}
现在完全没有显示叠加图,可能是什么问题?
更新
IDE的跟踪窗口显示System.ArgumentException
和System.FormatException
。问题源是否是XAML中未知类型的枚举PingStatus
?
3条答案
按热度按时间7xzttuei1#
你需要两件事来让它工作:
1 -在XAML文件的根元素中添加一个
xmlns
引用,到定义Enum的命名空间:2 -在
DataTrigger
的Value
属性中,使用{x:Static}
形式:请注意,Enum类型必须以上面定义的xmlns前缀作为前缀。
编辑:
如果你的枚举是在一个类中声明的,你需要使用以下语法:
{x:Static namespace:ClassName+EnumName.EnumValue}
例如:
{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}
3phpmpom2#
完成WPF + MVVM的工作示例。
在MSVC 2017上测试。
在视图中:
如果使用ReSharper,并且DataContext设置正确,则当您在
StatusIcon
之后点击.
时会有intellisense,即它将显示枚举的属性Debug
,Info
,Warning
或Error
。如果使用ReSharper,它将建议对XAML文件头中的命名空间进行以下更新(这样很好):
关于VieModel:
我们还使用
Fody
进行自动绑定。htrmnn0y3#
您可以简单地将枚举值设置为DataTrigger Value...在MSVC 2017上测试。