2

画像ソースをバインディング ソースのプロパティにバインドする代わりに、Image画像をリモートでフェッチする非同期メソッドを指定したいと考えています。2 つのパラメーターを渡すことができる必要があります。

画像取得

class ConnectImage
{
    public static async Task<BitmapImage> GetImageAsync(Uri uri, String sid)
    {
        HttpClient httpClient = new HttpClient();
        httpClient.DefaultRequestHeaders.Add("Authorization", "OAuth " + sid); 

        HttpResponseMessage response = await httpClient.GetAsync(uri);

        BitmapImage bmp = new BitmapImage();
        byte[] byteArray = await response.Content.ReadAsByteArrayAsync();

        InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();
        DataWriter writer = new DataWriter(ras.GetOutputStreamAt(0));
        writer.WriteBytes(byteArray);
        BitmapImage image = new BitmapImage();
        image.SetSource(ras);
        return image;
    }
}

リストビュー

<ListView
        x:Name="itemListView"
        Grid.Row="1"
        ItemsSource="{Binding Source={StaticResource itemsViewSource}}"
        IsSwipeEnabled="False"
        ItemTemplate="{StaticResource FeedItemTemplate}"/>

FeedItemTemplate

<DataTemplate x:Key="FeedItemTemplate">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Border Width="110" Height="110">
            <Image Source="{Binding Image}" Stretch="UniformToFill" />
        </Border>
    </Grid>
</DataTemplate>
4

1 に答える 1

2

プロパティを にすることはできないため、完了時にプロパティを設定asyncする初期化が必要です。async

VM で:

public BitmapImage Image { get; private set; }

public async Task Load()
{
  Image = await ConnectImage.GetImageAsync(...);
  ... // other asynchronously-loaded properties
}

次に、ページLoadedイベントに VM をロードさせます。

public async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
  await vm.Load();
}

ページは最初に にImage設定されて表示されnull、画像が読み込まれるとページに表示されます。

于 2012-11-27T13:51:11.740 に答える