我希望将图像源绑定(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/