Связанное изображение с конвертером не отображается в 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;
}
и теперь все работает.