Tworzę RPG w WPF i C#. Mam przyciski ruchu z załączonymi obrazkami. Próbuję dowiedzieć się, jak zmienić obraz przycisku w zależności od tego, czy jest dostępne pomieszczenie, do którego można się przenieść w tym kierunku. Szukałem konwerterów, ale nie jestem pewien, jak je zaimplementować w mojej sytuacji.

Oto jeden przykład, który próbowałem zaimplementować, który znalazłem w Internecie:

<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 = ...,
};

}

Oto część kodu, nad którym pracuję

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

Mam już funkcje dla wartości logicznych, próbuję tylko dowiedzieć się, jak zaimplementować konwerter, aby zmienić obraz przycisku.

Użyłem Boolean Visibility i mam nadzieję zrobić coś podobnego.

Visibility="{Binding HasMonster, Converter={StaticResource BooleanToVisibility}}"
1
MDiG 9 listopad 2018, 22:48

1 odpowiedź

Najlepsza odpowiedź

Lepiej powiąż właściwość Source elementu Image w treści przycisku:

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

Konwerter bezpośrednio zwróci BitmapImage. Jeśli pliki obrazów mają być zasobami zestawu (tj. Są częścią projektu Visual Studio, a ich akcja kompilacji jest ustawiona na Zasób), należy je załadować z identyfikatorów URI pakietu:

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();
    }
}

Możesz dodać konwerter do zasobów systemu Windows w następujący sposób:

<Window.Resources>
    <local:BooleanToImageConverter x:Key="MyBooleanToImageConverter"/>
    ...
</Window.Resources>
1
Clemens 9 listopad 2018, 23:50