c# - 如何绑定(bind)到异步图像源

标签 c# windows-8 windows-store-apps

我希望将图像源绑定(bind)到绑定(bind)源的 Image 属性,而是指向远程获取图像的异步方法。我需要能够传入两个参数。

图像获取

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

<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>

最佳答案

属性不能是异步,因此您需要一个异步初始化,以便在完成时设置属性。

在您的虚拟机中:

public BitmapImage Image { get; private set; }

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

然后让您的页面 Loaded 事件加载您的虚拟机:

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

您的页面最初显示时会将 Image 设置为 null,加载图像后,它将显示在页面上。

关于c# - 如何绑定(bind)到异步图像源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13577624/

相关文章:

c# - Youtube Windows Store App API

c# - 通用输出目录、Web 应用程序和 IIS Express

html - 使页面在 Windows 8 应用程序中可滚动

javascript - 如何为 Windows 8 和 Android 平板电脑制作 D3js 应用程序的 Web 应用程序

windows-8 - 我如何利用 Microsoft Rx 框架在 WinRT/Windows 8 中有效地实现 Bing Map

c# - 小型转储中的 .ni.dll 和 .ni.exe 文件是什么?

c# - C++ 和 C# 与 Crypto 之间加密的互操作性

c# - 如何在 C# 中转换传递给 Thread 的参数的数据类型

c# - 将 C# byte[] 传递给 C char 指针

c++ - 在 native C++ Metro 应用程序中使用剪贴板