【发布时间】:2014-04-18 10:45:33
【问题描述】:
我有一个问题,我在 LINQ 语句中调用 Task<> 方法并尝试从 Task<> 方法返回数据(图像)。我无法让Task<> 方法返回数据(图像),我收到以下错误:
无法隐式转换类型“System.Threading.Tasks.Task” 到“System.Uri”。
这是带有 LINQ 语句的 DownloadStringCompleted 方法,其中我调用 GetTest Task 方法:
private async void GetGamesListRequestCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
var feedXml = XDocument.Parse(e.Result);
var gameData = feedXml.Root.Descendants("Game").Select(x => new GetGamesList
{
ID = (int)x.Element("id"),
GameTitle = (string)x.Element("GameTitle"),
ReleaseDate = (string)x.Element("ReleaseDate"),
Platform = (string)x.Element("Platform"),
Front = GetTest((int)x.Element("id")), // THE METHOD WITH PROBLEM.
})
.ToList();
foreach (var item in gameData)
{
GetGamesListItems.Add(item);
}
}
}
Task GetTest 方法在尝试返回数据(图像)时遇到问题:
public Task<string> GetTest(int id)
{
var tcs = new TaskCompletionSource<string>();
var client = new WebClient();
client.DownloadStringCompleted += (s, e) =>
{
if (e.Error == null)
{
var feedXml = XDocument.Parse(e.Result);
var gameData = feedXml.Root.Descendants("Images").Select(x => new GetArt
{
BoxArtFrontThumb = new Uri(GetBoxArtFront(x)),
})
.ToList();
foreach (var item in gameData) GetArtItems.Add(item);
foreach (var i in GetArtItems)
{
tcs.SetResult("http://thegamesdb.net/banners/" + i.BoxArtFrontThumb.ToString());
}
}
else
{
tcs.SetException(e.Error);
}
};
client.DownloadStringAsync(new Uri("http://thegamesdb.net/api/GetArt.php?id=" + id.ToString()));
return tcs.Task;
}
我存储图像的 ObservableCollection: 私有 ObservableCollection _GetArtItems = new ObservableCollection();
public ObservableCollection<GetArt> GetArtItems
{
get
{
return this._GetArtItems;
}
}
我从 XML 获取图像的地方:
private static string GetBoxArtFront(XElement gameNode)
{
return "http://thegamesdb.net/banners/" + (string)gameNode.Descendants("boxart")
.FirstOrDefault(b => (string)b.Attribute("side") == "front");
}
这是我用来存储数据(图像)的类:
public class GetArt
{
public Uri BoxArtFrontThumb { get; set; }
}
这是我想在其中显示数据(图像)的 LongListSelector:
<phone:LongListSelector Name="llsGameList" Background="#242424" ItemsSource="{Binding}" Tap="llsGameList_Tap" Margin="0,90,0,0">
<phone:LongListSelector.ItemTemplate>
<DataTemplate>
<Grid>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu Name="ContextMenu">
<toolkit:MenuItem
Name="addToFavorite"
Header="Add to favorite"
Click="addToFavorite_Click"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<StackPanel>
<Border Background="{StaticResource PhoneAccentBrush}"
Padding="{StaticResource PhoneTouchTargetOverhang}"
Margin="{StaticResource PhoneTouchTargetOverhang}">
<TextBlock Name="tblGameTitle" Style="{StaticResource PhoneTextGroupHeaderStyle}" ManipulationStarted="tblGameTitle_ManipulationStarted" ManipulationCompleted="tblGameTitle_ManipulationCompleted">
<Run Text="{Binding GameTitle}"></Run>
</TextBlock>
</Border>
<Image Source="{Binding Front}" Height="200" Width="200"></Image> // HERE IM BINDING TO MY FRONT PROPERTY TO SHOW THE IMAGES
<TextBlock TextWrapping="Wrap" Foreground="YellowGreen" Style="{StaticResource PhoneTextNormalStyle}" Padding="{StaticResource PhoneTouchTargetOverhang}"
FontSize="{StaticResource PhoneFontSizeNormal}">
<Run Text="Platform: "></Run>
<Run Text="{Binding Platform}"></Run>
</TextBlock>
<TextBlock Foreground="YellowGreen" Style="{StaticResource PhoneTextNormalStyle}" Padding="{StaticResource PhoneTouchTargetOverhang}"
FontSize="{StaticResource PhoneFontSizeNormal}">
<Run Text="Release Date: "></Run>
<Run Text="{Binding ReleaseDate}"></Run>
</TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
</phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>
这是我的 DataContext,它获取 gd.GetGamesListItems,其中包含我想在 LongListSelector 中显示的图像:
public MainPage()
{
InitializeComponent();
llsGameList.DataContext = gd.GetGamesListItems;
}
我希望有人可以帮助我:)。谢谢。
【问题讨论】:
标签: c# xml linq windows-phone-8 task-parallel-library