Почему мои BitmapImages не отображаются?

Реклама примера Брундритта здесь, на который он ссылался, отвечая на мой предыдущий вопрос BingMaps, я смог отобразить определенные данные в "информационном окне" следующим образом:

введите здесь описание изображения

... но я не получаю BitmapImage, который является частью данных, которые я собираюсь отображать.

Мой вопрос: почему изображения не отображаются, и что мне нужно сделать, чтобы отобразить их?

Это не данные — я сохранил миниатюру в базе данных SQLite, где она хранится в виде массива байтов, но которую можно увидеть как изображения в SQLiteToolbox:

SQLiteToolbox:

Итак, как вы можете видеть, данные String отображаются нормально, но не изображение. Вот соответствующий код, который у меня есть для получения данных и их отображения:

// The class used to create the SQLite table
public class PhotraxBaseData
{
    [SQLite.PrimaryKey]
    [SQLite.AutoIncrement]
    public int Id { get; set; }
    . . .
    public DateTime dateTimeTaken { get; set; }
    public String filePath { get; set; }
    public Byte[] thumbnail { get; set; }
}

private async void Gener8MapMarkers(List<PhotraxBaseData> _pbd)
{
    foreach (PhotraxBaseData pbd in _pbd)
    {
        String descAndFilename = Path.GetFileName(pbd.filePath);

        if (null != pbd.imgDescription)
        {
            descAndFilename = String.Format("{0} - {1}", pbd.imgDescription, descAndFilename);
        }
        BitmapImage bmi = await PhotraxUtils.ByteArrayToBitmapImage(pbd.thumbnail);
        if (PhotraxUtils.ValidLatAndLong(pbd.latitude, pbd.longitude))
        {
            Location loc = new Location(pbd.latitude, pbd.longitude);
            AddPushpin(loc, descAndFilename, pbd.dateTimeTaken, null, DataLayer);
        }
    }
}

public static async Task<BitmapImage> ByteArrayToBitmapImage(this byte[] byteArray)
{
    // from http://dotnetspeak.com/2013/04/convert-byte-array-to-an-image-in-winrt
    if (byteArray != null)
    {
        using (var stream = new InMemoryRandomAccessStream())
        {
            await stream.WriteAsync(byteArray.AsBuffer());
            var image = new BitmapImage();
            stream.Seek(0);
            image.SetSource(stream);
            return image;
        }
    }
    return null;
}

public class PushpinMetadata
{
    public string DescAndFileName { get; set; }
    public DateTime DateTimeTaken { get; set; }
    public BitmapImage Thumbnail { get; set; }
}

public void AddPushpin(Location latlong, string descAndFileName, DateTime dateTimeTaken, BitmapImage thumbnail, MapLayer layer)
{
    Pushpin p = new Pushpin()
    {
        Tag = new PushpinMetadata()
        {
            DescAndFileName = descAndFileName,
            DateTimeTaken = dateTimeTaken,
            Thumbnail = thumbnail
        }
    };

    MapLayer.SetPosition(p, latlong);
    p.Tapped += PinTapped;
    layer.Children.Add(p);
}

private void PinTapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
    Pushpin p = sender as Pushpin;
    PushpinMetadata m = (PushpinMetadata)p.Tag;

    //Ensure there is content to be displayed
    if (!String.IsNullOrEmpty(m.DescAndFileName))
    {
        Infobox.DataContext = m;
        Infobox.Visibility = Visibility.Visible;
        MapLayer.SetPosition(Infobox, MapLayer.GetPosition(p));
    }
    else
    {
        Infobox.Visibility = Visibility.Collapsed;
    }
}

XAML:

<bm:Map.Children>
    <!-- Data Layer-->
    <bm:MapLayer Name="DataLayer"/>
    <!--Common Infobox-->
    <bm:MapLayer>
        <Grid x:Name="Infobox" Visibility="Collapsed" Margin="0,-115,-15,0">
            <Border Width="300" Height="110" Background="Black" Opacity="0.8" BorderBrush="White" BorderThickness="2" CornerRadius="5"/>
            <StackPanel Height="100" Margin="5">
                <Grid Height="40">
                    <TextBlock Text="{Binding DescAndFileName}" FontSize="20" Width="250" TextWrapping="Wrap" HorizontalAlignment="Left" />
                    <Button Content="X" Tapped="CloseInfobox_Tapped" HorizontalAlignment="Right" VerticalAlignment="Top"/>
                </Grid>
                <Grid Height="40">
                    <Viewbox Height="200" Stretch="Uniform" StretchDirection="Both">
                        <Image Source="{Binding Thumbnail}" Width="Auto" Height="Auto" Margin="2"/>
                    </Viewbox>
                </Grid>
                <Grid Height="40">
                    <TextBlock Text="{Binding DateTimeTaken}" FontSize="16" Width="290" TextWrapping="Wrap" Height="Auto"/>
                </Grid>
            </StackPanel>
        </Grid>
    </bm:MapLayer>
    <callisto:CustomDialog Content="CustomDialog" Height="100" Width="100"/>
</bm:Map.Children>

Я предполагаю, что свойство Source изображения не совсем знает, что делать с BitmapImage, к которому оно привязано через «Миниатюру»; но я не знаю, как устранить несоответствие (предполагая, что проблема именно в этом).

ОБНОВИТЬ

Чтобы ответить брату Фэй Крису, вот объявление «базы данных» (класс SQLite):

public Byte[] thumbnail { get; set; }

Здесь я вызывал метод преобразователя, передавая соответствующий член экземпляра класса, а затем добавляя канцелярскую кнопку:

BitmapImage bmi = await PhotraxUtils.ByteArrayToBitmapImage(pbd.thumbnail);
if (PhotraxUtils.ValidLatAndLong(pbd.latitude, pbd.longitude))
{
    Location loc = new Location(pbd.latitude, pbd.longitude);
    //AddPushpin(loc, descAndFilename, pbd.dateTimeTaken, null, DataLayer);
    AddPushpin(loc, descAndFilename, pbd.dateTimeTaken, bmi, DataLayer);
}

Однако: ПЛОХО, ЛЮДИ!!!

Я забыл заменить свой аргумент-заполнитель «null» на «bmi» (вы можете увидеть мой предыдущий код, закомментированный выше, и мой новый рабочий вызов AddPushpin() под ним). Размер/масштаб изображения неправильный, но, я думаю, это можно легко исправить.

Не знаю, то ли прыгать от радости, то ли пинать себя в кейстер, поэтому думаю, что сделаю и то, и другое одновременно.

Спасибо г-ну Данауэю за то, что он заставил меня поближе взглянуть на мой код — то, что я, очевидно, должен был сделать перед публикацией.


person B. Clay Shannon    schedule 24.10.2014    source источник
comment
Несколько вещей, которые нужно проверить - убедитесь, что привязка работает (проверьте окно вывода на наличие ошибок привязки и/или используйте конвертер отладки), проверьте, работает ли макет (он может быть там, просто 0 размер) и проверьте, есть ли BItmapImage - посмотрите, возможно, вы можете отобразить это каким-то другим способом.   -  person Filip Skakun    schedule 24.10.2014
comment
Можете ли вы показать код, где вы запрашиваете данные из базы данных? Какой тип столбца в базе данных?   -  person Chris Dunaway    schedule 24.10.2014
comment
@FilipSkakun: я не вижу в выводе ничего интересного; Я искал привязку и изображение и ничего не нашел. Что касается размера, разве Width и Height=Auto в XAML не препятствуют созданию изображения с нулевым размером?   -  person B. Clay Shannon    schedule 24.10.2014
comment
Пожалуйста, смотрите мое обновление - в значительной степени решено.   -  person B. Clay Shannon    schedule 24.10.2014