在 C# 中将图像作为可观察集合包含在内



我刚刚问了一个关于 linq for rank in C# 的问题:C# 中的 Linq List Ranking 得到了回答。问题是根据他们的分数对我拥有的人进行排名。所以现在我想添加一些与这个人的分数相等的星星。例如:

Rank Name Score Stars
1   John  5    *****
2   Ed    4    ****
3   Sara  3    ***

星星应该是实际的.png星图像。我的问题是,实现这一点的最佳方法是什么?这是我尝试过的尝试,但它对我不起作用:

public class Person
{
public int Rank { get; set; }
public string Name { get; private set; }
public int Score { get; set; }
public Image Star { get; set; }
public Person(int rank, string name, int score, Image star)
{
Rank = rank;
Name = name;
Score = score;
Star = star;
}
}
public ObservableCollection<Person> Persons { get; set; }
public MainWindow()
{
InitializeComponent();
var lines = File.ReadAllLines(filepath);
Persons = new ObservableCollection<Person>();
var data = lines.Select(line => {
var column = line.Split(',');
var name = column[0];
int score = int.Parse(column[1]);
int rank =0;
Image star = new Image();
return new { name, score, avg, rank, star };
});
var groupedData = data.GroupBy(p => p.name).Select((g, i) => new { name = g.Key, rank = i + 1, score = g.Sum(p => p.score), star = new BitmapImage(new Uri(@"PicsMinusRate.png", UriKind.Relative))}).OrderByDescending(x => x.score);
var persons = groupedData.Select((p, i) => new Person(i+1, p.name, p.score,p.star));
foreach (var person in persons) {
Persons.Add(person);
}
datagrid.ItemsSource = Persons;
} 

那么,将明星纳入此列表的最佳方法是什么?

在我看来,您绝对应该将其作为UI问题。不要尝试为数据的内存表示预渲染星形图像。你那里有信息(int Score(,就是这样。让其余部分做你的 UI。

想象一下,任何开发人员出于非 UI 目的请求数据:他当然不希望代码为每个查询呈现图像,他可能想知道内存消耗(RAM 和网络流量(来自哪里。

数据到达 UI 后,即可进行映像。例如,如果使用 GDI+,则可以像这样呈现图像:

// the icon file with one single star
var starIcon = Image.FromFile(...);
// the image of all stars (the width has to be the width of one star multiplied by the count of stars)
var image = new Bitmap(starsCount * starIcon.Width, starIcon.Height);
using (var g = Graphics.FromImage(image))
{
for (int i = 0; i < starCount; i++)
{
// place the star icon to its position in the loop
int x = (i * starIcon.Width);
// https://msdn.microsoft.com/de-de/library/dbsak4dc(v=vs.110).aspx
g.DrawImage(starIcon, x, 0, starIcon.Width, starIcon.Height);
}
g.Flush();
}

请注意,这更像是伪代码 - 我没有将其放入编译器中,因此它可能不会那样编译。

更新:

我在这里做了一个工作小提琴:https://dotnetfiddle.net/HPB7BR

请注意,您不需要GetImageFromURL()它只是将图像放入该在线小提琴中。而且,由于我无法在该小提琴中将图像显示为输出,因此我选择将图像的大小显示为输出。无论如何,变量image中的图像已准备就绪,可供使用。您可以更改starCount以查看图像宽度如何相应地变化。

相关内容

  • 没有找到相关文章

最新更新