需要有关如何制作包含不同项目的列表,将其绑定到 ListView 的说明
Need directions on how to make a List with different items, to bind it to a ListView
我需要制作一个 ListView,其中每一行都有一个图像,然后是一个文本,然后是另一个图像。
由于要制作 GridView,我必须将其 DataContext 绑定到包含所有图像的列表,并且它们(几乎)以相同的方式工作,我想我需要制作另一个包含图像和文本的列表
格式为:"Store Logo. Promotion Text. Credit Card Logo",所有这些数据均来自 API。
我已经将所有图片保存在不同的文件夹中("Stores" 和 "PaymentMethods"),我得到的文字如
myTextBlock.text = item.promotion;
现在我的问题是:
1) 是否可以将所有这些数据列成一个列表?如何? (或者我必须在哪里寻找它)
2) 获得列表后,如何通过绑定它来确保它符合我上面提到的格式?
(我尝试过的是在运行时创建所有内容,而不是使用 ListView:
public async void getPromos()
{
if (Resp.searchResults.Count > 0)
{
var selected = from promo in Resp.searchResults
where (promo.store_id != null || promo.method_id != null)
select new
{
store = promo.store_id,
medio = promo.method_id,
endDay = promo.to,
promocion = promo.desc
};
foreach (var item in selected)
{
Debug.WriteLine(item.store);
await showPromos(item.store, item.medio, item.endDay, item.promocion);
}
}
}
async Task showPromos(string store, string medio, string endDay, string promocion)
{
Debug.WriteLine(store);
Debug.WriteLine("medio" + medio);
StorageFolder folder1 = await KnownFolders.PicturesLibrary.GetFolderAsync("UnicenterMediosFolder");
StorageFolder folder2 = await KnownFolders.PicturesLibrary.GetFolderAsync("UnicenterStores");
if (store != null)
{
StorageFile file = await folder2.GetFileAsync(store + ".png");
ImageProperties properties = await file.Properties.GetImagePropertiesAsync();
if (properties.Width > 0)
{
var bitmap = new WriteableBitmap((int)properties.Width, (int)properties.Height);
bitmap.SetValue(NameProperty, (string)properties.Title);
Debug.WriteLine(bitmap.PixelWidth);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
bitmap.SetSource(stream);
}
Color customColor = ColorHelper.FromArgb(213, 213, 213, 213);
StackPanel casa = new StackPanel();
casa.Orientation = Orientation.Horizontal;
casa.Background = new SolidColorBrush(customColor);
casa.Height = 70;
Image promoImage = new Image();
promoImage.Source = bitmap;
promoImage.Width = 70;
promoImage.Height = 70;
TextBlock thePromo = new TextBlock();
thePromo.Text = promocion;
thePromo.Foreground = new SolidColorBrush(Colors.Gray);
casa.Children.Add(promoImage);
casa.Children.Add(thePromo);
gridForPromos.Children.Add(casa);
Debug.WriteLine("aaa" + gridForPromos.Children.Count);
}
}
}
在我的 xaml:
<ScrollViewer x:Name="myPromoSpace" Grid.Row="2">
<Grid x:Name="gridForPromos"/>
</ScrollViewer>
但是这样做,我将每个堆栈面板放在前一个堆栈面板上,而不是让它们一个放在另一个下面)
你们能给我指出正确的方向吗?
当您在没有设置 Grid.Row 和具有 Grid.Row 定义的情况下将元素添加到网格时,所有子项都将位于同一个网格单元格中。您要么需要添加 RowDefinitions 并设置子项的行:
gridForPromos.RowDefinitions.Add(new RowDefinition(...))
Grid.SetRow(casa, gridForPromos.RowDefinitions.Count);
或用 StackPanel 替换您的网格:
<StackPanel x:Name="gridForPromos" />
但我更愿意为您的项目定义一个 DataTemplate。有了它,您可以在 XAML 中定义项目的视觉外观,并简单地将 StackPanel 绑定到您的项目。这里有一个 link 告诉你如何做:http://www.wpftutorial.net/datatemplates.html
我需要制作一个 ListView,其中每一行都有一个图像,然后是一个文本,然后是另一个图像。
由于要制作 GridView,我必须将其 DataContext 绑定到包含所有图像的列表,并且它们(几乎)以相同的方式工作,我想我需要制作另一个包含图像和文本的列表
格式为:"Store Logo. Promotion Text. Credit Card Logo",所有这些数据均来自 API。
我已经将所有图片保存在不同的文件夹中("Stores" 和 "PaymentMethods"),我得到的文字如
myTextBlock.text = item.promotion;
现在我的问题是:
1) 是否可以将所有这些数据列成一个列表?如何? (或者我必须在哪里寻找它)
2) 获得列表后,如何通过绑定它来确保它符合我上面提到的格式?
(我尝试过的是在运行时创建所有内容,而不是使用 ListView:
public async void getPromos()
{
if (Resp.searchResults.Count > 0)
{
var selected = from promo in Resp.searchResults
where (promo.store_id != null || promo.method_id != null)
select new
{
store = promo.store_id,
medio = promo.method_id,
endDay = promo.to,
promocion = promo.desc
};
foreach (var item in selected)
{
Debug.WriteLine(item.store);
await showPromos(item.store, item.medio, item.endDay, item.promocion);
}
}
}
async Task showPromos(string store, string medio, string endDay, string promocion)
{
Debug.WriteLine(store);
Debug.WriteLine("medio" + medio);
StorageFolder folder1 = await KnownFolders.PicturesLibrary.GetFolderAsync("UnicenterMediosFolder");
StorageFolder folder2 = await KnownFolders.PicturesLibrary.GetFolderAsync("UnicenterStores");
if (store != null)
{
StorageFile file = await folder2.GetFileAsync(store + ".png");
ImageProperties properties = await file.Properties.GetImagePropertiesAsync();
if (properties.Width > 0)
{
var bitmap = new WriteableBitmap((int)properties.Width, (int)properties.Height);
bitmap.SetValue(NameProperty, (string)properties.Title);
Debug.WriteLine(bitmap.PixelWidth);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
bitmap.SetSource(stream);
}
Color customColor = ColorHelper.FromArgb(213, 213, 213, 213);
StackPanel casa = new StackPanel();
casa.Orientation = Orientation.Horizontal;
casa.Background = new SolidColorBrush(customColor);
casa.Height = 70;
Image promoImage = new Image();
promoImage.Source = bitmap;
promoImage.Width = 70;
promoImage.Height = 70;
TextBlock thePromo = new TextBlock();
thePromo.Text = promocion;
thePromo.Foreground = new SolidColorBrush(Colors.Gray);
casa.Children.Add(promoImage);
casa.Children.Add(thePromo);
gridForPromos.Children.Add(casa);
Debug.WriteLine("aaa" + gridForPromos.Children.Count);
}
}
}
在我的 xaml:
<ScrollViewer x:Name="myPromoSpace" Grid.Row="2">
<Grid x:Name="gridForPromos"/>
</ScrollViewer>
但是这样做,我将每个堆栈面板放在前一个堆栈面板上,而不是让它们一个放在另一个下面)
你们能给我指出正确的方向吗?
当您在没有设置 Grid.Row 和具有 Grid.Row 定义的情况下将元素添加到网格时,所有子项都将位于同一个网格单元格中。您要么需要添加 RowDefinitions 并设置子项的行:
gridForPromos.RowDefinitions.Add(new RowDefinition(...))
Grid.SetRow(casa, gridForPromos.RowDefinitions.Count);
或用 StackPanel 替换您的网格:
<StackPanel x:Name="gridForPromos" />
但我更愿意为您的项目定义一个 DataTemplate。有了它,您可以在 XAML 中定义项目的视觉外观,并简单地将 StackPanel 绑定到您的项目。这里有一个 link 告诉你如何做:http://www.wpftutorial.net/datatemplates.html