Связанное изображение с конвертером не отображается в WPF

Я пытаюсь заставить окно отображать некоторые игральные карты - просто текстовый блок с 'A'-'K' и изображение костюма. У меня есть изображения, хранящиеся в Resources.resx как Resources.Spades, Resources.Hearts, так далее.

В моем Window.Resources xaml, у меня есть

<ResourceDictionary x:Name="HighCardsResources">
    <c:SuitToImageConverter x:Key="SuitConverter" />
    <DataTemplate x:Key="CardTemplate" DataType="{x:Type c:Card}">
        <Border CornerRadius="10" Width="50" Height="50" BorderBrush="Black" BorderThickness="2">
            <Grid Width="50" Height="50">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="18"/>
                    <ColumnDefinition Width="32"/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding RankText}" Grid.Column="0" FontSize="24" />
                <Image Source="{Binding Suit, Converter={StaticResource SuitConverter}}" Grid.Column="1" />
            </Grid>
        </Border>
    </DataTemplate>
</ResourceDictionary>

мой SuitToImageConverter код

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    switch ((Suit)value)
    {
        case Suit.Spades:
            return Resources.Spades;
        case Suit.Hearts:
            return Resources.Hearts;
        case Suit.Clubs:
            return Resources.Clubs;
        case Suit.Diamonds:
            return Resources.Diamonds;

        default:
            return null;
    }
}

Я динамически добавляю ContentPresenterс сеткой.

int col = 0;
foreach (Card card in hand.Cards)
{
    DataTemplate template = FindResource("CardTemplate") as DataTemplate;
    ContentPresenter cp = new ContentPresenter();
    cp.ContentTemplate = template;
    cp.SetValue(Grid.RowProperty, 0);
    cp.SetValue(Grid.ColumnProperty, col);
    cp.Width = 50;
    cp.Height = 50;
    cp.Content = card;
    grdHand.Children.Add(cp);

    col++;
}

Я знаю, что карта привязана правильно, потому что TextBlock получает правильную строку. Я также знаю, что SuitToImageConverter используется, и что правильный ресурс изображения возвращается (через отладку). По какой-то причине изображение просто не отображается. Идеи?

1 ответ

Решение

Я понял это благодаря этой ссылке. Resx изображения имеют тип Bitmap, в то время как Image.Source требует тип BitmapImage,

Я изменился SuitToImageConverter выглядеть как:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    switch ((Suit)value)
    {
        case Suit.Spades:
            return ConvertToBitmapImage(Resources.Spades);
        case Suit.Hearts:
            return ConvertToBitmapImage(Resources.Hearts);
        case Suit.Clubs:
            return ConvertToBitmapImage(Resources.Clubs);
        case Suit.Diamonds:
            return ConvertToBitmapImage(Resources.Diamonds);

        default:
            return null;
    }
}

private static BitmapImage ConvertToBitmapImage(Bitmap bitmap)
{
    BitmapImage img = new BitmapImage();
    img.BeginInit();

    MemoryStream stream = new MemoryStream();
    bitmap.Save(stream, ImageFormat.Bmp);
    stream.Seek(0, SeekOrigin.Begin);

    img.StreamSource = stream;
    img.EndInit();

    return img;
}

и теперь все работает.

Другие вопросы по тегам