C# WPF Image Converter для кнопок на основе логического значения

Я делаю RPG в WPF и C#. У меня есть кнопки с изображениями. Я пытаюсь выяснить, как изменить изображение кнопки в зависимости от того, есть ли место для перемещения в этом направлении. Я искал конвертеры, но я не совсем уверен, как реализовать их в моей ситуации.

Это один пример, который я попытался реализовать, который я нашел в Интернете:

<Button Content="{Binding MyBooleanValue, Converter={StaticResource 
MyBooleanToImageConverter}}" />


public object Convert(object value, Type targetType, object parameter, 
System.Globalization.CultureInfo culture)
{
bool v = (bool)value;

Uri path = new Uri((v ? "ImgSrcIfTrue.png" : "ImgSrcIfFalse.png"), UriKind.Relative);

return new Image()
{
    Source = new System.Windows.Media.Imaging.BitmapImage(path),
Height = ...,
Width = ...,
};

}

Вот часть кода, над которым я работаю

<!-- Movement Buttons -->
<Button Grid.Row="1" Grid.Column="1"
    Click="OnClick_MoveNorth">
   <StackPanel>
 <Image Source= "/Image/Buttons/Up.png"/>
   </StackPanel>
 </Button>

У меня уже есть функции для логических значений, я просто пытаюсь выяснить, как реализовать конвертер для изменения изображения кнопки.

Я использовал Boolean Visibility и надеюсь сделать что-то подобное.

Visibility="{Binding HasMonster, Converter={StaticResource BooleanToVisibility}}"

1 ответ

Решение

Лучше связать свойство Source элемента Image в содержимом кнопки:

<Button>
    <Image Source="{Binding MyBooleanValue,
                    Converter={StaticResource MyBooleanToImageConverter}}"/>
</Button>

Конвертер будет напрямую возвращать BitmapImage. Если предполагается, что файлы изображений являются ресурсами сборки (т. Е. Они являются частью вашего проекта Visual Studio, а их Build Action имеет значение Resource), они должны быть загружены из пакетов URI:

public class BooleanToImageConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        var uri = (bool)value
            ? "pack://application:,,,/ImgSrcIfTrue.png"
            : "pack://application:,,,/ImgSrcIfFalse.png";
        return new BitmapImage(new Uri(uri));
    }

    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Вы бы добавили конвертер к ресурсам окна следующим образом:

<Window.Resources>
    <local:BooleanToImageConverter x:Key="MyBooleanToImageConverter"/>
    ...
</Window.Resources>
Другие вопросы по тегам