我有一个带有固定背景图像的按钮,并想在它上面显示一个小的覆盖图像。选择哪个覆盖图像取决于相应视图模型的依赖属性(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);
}
}
}
现在,根本没有显示覆盖图像。可能出了什么问题?
更新
我的集成开发环境的跟踪窗口显示System.ArgumentException
和System.FormatException
。问题的根源可能是XAML中未知类型的枚举PingStatus
吗?
发布于 2012-12-17 23:48:40
你需要两件事才能让它正常工作:
1-在XAML文件的根元素中将xmlns
引用添加到定义枚举的命名空间:
<UserControl ...
xmlns:my="clr-namespace:YourEnumNamespace;assembly=YourAssembly">
2-在DataTrigger
的Value
属性中,使用{x:Static}
表单:
<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static my:PingStatus.PING_UNKNOWN}">
请注意,Enum类型必须以上面定义的xmlns前缀作为前缀。
编辑:
如果您的Enum是在类中声明的,则需要使用以下语法:
{x:Static namespace:ClassName+EnumName.EnumValue}
例如:
{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}
发布于 2019-09-23 21:27:54
完整的WPF + MVVM工作示例。
在MSVC 2017上测试。
在视图中:
<TextBlock Text="Some text to be colored by an enum">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding StatusIcon}" Value="{x:Static my:StatusIcon.Warning}">
<Setter Property="Foreground" Value="Yellow"/>
</DataTrigger>
<DataTrigger Binding="{Binding StatusIcon}" Value="{x:Static my:StatusIcon.Error}">
<Setter Property="Foreground" Value="Red}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
如果使用ReSharper,并且DataContext设置正确,那么当您在StatusIcon
之后点击.
时,将会有智能感知,即它将显示枚举的属性,即Debug
、Info
、Warning
或Error
。
如果使用ReSharper,它将建议对XAML文件头中的名称空间进行以下更新(这很好):
xmlns:my="clr-namespace:Class.Path.MyViewModel;assembly=MyAssembly"
和VieModel:
public enum StatusIcon
{
Debug,
Info,
Warning,
Error
}
public class MyViewModel
{
public StatusIcon StatusIcon { get; }
}
我们还使用Fody
进行自动绑定。
发布于 2020-10-29 05:47:53
您可以简单地将枚举值设置为DataTrigger值...在MSVC 2017上测试。
<TextBlock Text="Some text to be colored by an enum">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding StatusIcon}" Value="Warning">
<Setter Property="Foreground" Value="Yellow"/>
</DataTrigger>
<DataTrigger Binding="{Binding StatusIcon}" Value="Error">
<Setter Property="Foreground" Value="Red}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
https://stackoverflow.com/questions/13917033
复制相似问题