У меня есть кнопка с фиксированным фоновым изображением, и я хотел бы показать небольшое оверлейное изображение поверх нее. Выбор изображения наложения зависит от свойства зависимости ( 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?
Ответы:
Чтобы это работало, вам нужны 2 вещи:
1 - Добавьте
xmlns
ссылку в корневой элемент вашего XAML-файла в пространство имен, в котором определено ваше Enum:2 - в
Value
свойствеDataTrigger
используйте{x:Static}
форму:Обратите внимание, что тип Enum должен иметь префикс xmlns, который вы определили выше.
Редактировать:
Если ваш Enum объявлен внутри класса, вам нужно использовать синтаксис:
{x:Static namespace:ClassName+EnumName.EnumValue}
например:
{x:Static my:ConfigurationViewModel+PingStatus.PING_UNKNOWN}
источник
xmlns
так:xmlns:local="clr-namespace:MyCompany.Testbench"
и триггер вот так<DataTrigger Binding="{Binding Path=LapCounterPingStatus}" Value="{x:Static local:PingStatus.PING_UNKNOWN}">
. Нет, я получаю сообщение об ошибкеCannot find the type 'PingStatus'
.enum PingStatus
определяется внутри классаMyCompany.TestBench.ConfigurationViewModel
. Надо ли мне где-нибудь добавить имя класса?Type t = typeof (System.Environment.SpecialFolder); Console.WriteLine (t.FullName); // prints System.Environment+SpecialFolder
Полный рабочий пример для WPF + MVVM.
Проверено на MSVC 2017.
В представлении:
Если вы используете ReSharper и если DataContext настроен правильно, то при нажатии на «
.
after» будет отображаться intellisenseStatusIcon
, т.е. он покажет свойства перечисленияDebug
, напримерInfo
,Warning
илиError
.При использовании ReSharper он предложит следующее обновление пространства имен в заголовке файла XAML (это хорошо):
И VieModel:
Мы также используем
Fody
для автоматической привязки.источник