배경 이미지가 고정 된 버튼이 있는데 그 위에 작은 오버레이 이미지를 표시하고 싶습니다. 선택할 오버레이 이미지 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
. 문제의 원인이 PingStatus
XAML 에서 알 수없는 열거 유형일 수 있습니까?
답변
이 작업을 수행하려면 두 가지가 필요합니다.
1- xmlns
XAML 파일의 루트 요소에 있는 참조를 Enum이 정의 된 네임 스페이스에 추가합니다.
<UserControl ...
xmlns:my="clr-namespace:YourEnumNamespace;assembly=YourAssembly">
2-의 Value
속성에서 DataTrigger
다음 {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}
답변
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>
DataContext를가 제대로 설정되어있는 경우 당신이 명중 할 때 ReSharper에서를 사용하는 경우와, 인텔리있을 것입니다 .
후를 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
자동 바인딩 에도 사용 합니다.