一个跟踪文章评分的应用程序






4.79/5 (18投票s)
收集并记录你的文章评分以及一些新的汇总评分

单击图像查看全尺寸屏幕截图
目录
引言
我喜欢关注我的文章的表现,所以我写了一个小程序来跟踪它们。我认为这可能会引起其他作者的兴趣,所以在这里分享……
要求
这个 WPF 应用程序是用 C# 3.0 编写的,使用 Visual Studio 2008,需要 .NET 3.5。
注意事项
请不要滥用此工具,不要加载大量成员或过于频繁地获取评分。Chris 慷慨地允许我发布此程序,所以请不要通过使服务器过载让他后悔。
快速入门
如果您想直接开始,这是您应该阅读的部分。它并不复杂。
在 **用户** 菜单中,选择 **添加用户**。这将弹出一个对话框,您可以在其中输入 CodeProject 的成员 ID。这是成员的 **谁是谁** 页面上显示的数字。根据需要重复。
按 **获取评分** 按钮。
将更新后的数据保存到文件。
指标
这是应用程序记录的指标的简要说明,包括 CodeProject 计算的指标和我添加的几个指标。
评分
这是由 CodeProject 计算的。我相信每个投票都会根据投票者的“状态”进行加权,但我不太确定细节。正如您所知,这是一个介于 1 和 5 之间的数字(包含)。
Popularity
这也是由 CodeProject 计算的,但其公式是已知的。它为
popularity = rating * log10( number of votes )
X-评分
这是一个针对每个作者所有文章的新汇总指标。它基本上是每篇文章评分的平均值,但根据文章的投票数进行了加权。因此,我需要指出,零投票的文章不计入 X-Rating 指标。
xrating = [ sum over all articles of ( votes * rating ) ] / [ total number of votes ]
X-人气
这也是针对每个作者的新汇总指标。它基于每篇文章的受欢迎程度公式。
xpopularity = xrating * log10( total number of votes )
高亮显示
为了区分自上次下载以来发生的任何变化,网格中的单元格会变成黄色以表示已更改的指标。因此,您可以轻松地看到是否有人投票给您的文章,并钻入网格以查找详细信息。
使用应用程序
获取评分
“获取评分”按钮适用于组合框中当前选定的用户。如果选择了“所有用户”,它将为每个加载的用户下载并解析一个页面。如果选择了特定用户,它将仅获取该用户的信息。
如果您每天左右收集一次评分,您很快就会积累历史统计数据,显示您的文章随时间的变化。
视图
有五个视图。“所有作者”视图列出了文件中所有作者的汇总评分。然后有两对视图。第一对是“总计”和“历史”视图。这些显示特定作者随时间的汇总评分以及特定日期的评分。第二对是“文章”和“详细信息”。这些显示特定作者的当前评分和特定文章的收集到的评分。
您可以双击网格中的数据行,或按按钮来更改视图。视图会在每对视图之间切换。您可以按 **Ctrl+A** 选择“所有作者”,这将再次显示作者视图。
持久化
您可以将数据保存到文件,格式为 *.xml 或 *.bob。区别在于 *.bob 文件使用 GZipStream
压缩 XML。这种压缩将文件大小减小了大约十倍。
没有“您想保存更改吗”的对话框,所以请记住在更新后保存您的文件。
编辑
除了添加用户,您唯一可以进行的编辑是删除一行。只需选择一行并按 Backspace
或 Delete
键。此功能在所有视图中都有效,用于删除作者、文章或单个详细信息。当然,您始终可以选择从文件中重新加载数据,从而放弃所有未保存的更改。
工作原理
来自 CodeProject 的数据
所有数据都可以在每个成员的文章摘要页面上找到。该应用程序会获取该页面并使用 RegEx
进行解析。这意味着它非常脆弱,如果 Chris 更改了任何一个空格,它就会停止工作。不过,他并不经常这样做。在我使用此程序的两年来,我只调整过几次 RegEx
。
RegEx
位于 CodeProject.cs 文件中,如果您想看一下的话。
持久化
当您保存到文件时,所有收集到的数据都会被持久化。没有任何内容会被丢弃。这意味着通过每天或每隔几天进行一次快照,您可以建立评分的历史记录。这反过来又能让应用程序突出显示文章上的新投票。
汇总详细信息会在需要时从文章统计数据中计算得出,因此它们始终反映您的当前数据。如果您感兴趣,Data.cs 文件中包含一些 LINQ 的有趣操作。
Xceed.Wpf.DataGrid
Xceed 编写了一个优秀的 WPF 网格控件,并提供了一个 **免费** 的“Express Edition”。在撰写本文时,他们刚刚在此处发布了 2.0 版本 [http://xceed.com/Grid_WPF_New.html](http://xceed.com/Grid_WPF_New.html) [ ^ ]。顺便说一句,他们是另一家仁慈的加拿大公司。
关注点
关于 WPF 的文章有很多,所以我不在这里赘述。不过,有几点值得一提。
按钮
按钮上的小圆圈来自一个巧妙的数据模板
<DataTemplate x:Key="ButtonTemplate">
<StackPanel Orientation="Horizontal">
<StackPanel.Width>
<Binding Path="Width" RelativeSource="{RelativeSource AncestorType=Button}" />
</StackPanel.Width>
<Ellipse Width="10" Height="10" Margin="0,0,10,0">
<Ellipse.Fill>
<RadialGradientBrush GradientOrigin="0.3, 0.3">
<GradientStop Offset="0.2"
Color="{StaticResource FloralWhiteColour}" />
<GradientStop Offset="1" Color="{StaticResource OrangeColour}" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
<ContentPresenter Content="{TemplateBinding Content}" />
</StackPanel>
</DataTemplate>
挂钩事件
双击网格中的一行可以切换视图。我尝试过的显而易见的方法是这样做
grid.MouseDoubleClick += ( s, a ) => SwapViews();
不幸的是,这也响应滚动条等区域的双击。
所以我决定在 DataRow
级别挂钩事件。幸运的是,您用于注册路由事件的 EventManager static
类还有一个名为 RegisterClassHandler
的方法。这允许您挂钩所有类实例上的事件。
EventManager.RegisterClassHandler(
typeof( DataRow ),
Control.MouseDoubleClickEvent,
new RoutedEventHandler( ( s, a ) => SwapViews() ) );
挂钩依赖属性
如果您想知道依赖属性何时发生更改,可以使用 DependencyPropertyDescriptor
类。
DependencyPropertyDescriptor.FromProperty(
DataGridControl.SelectedItemProperty,
typeof( DataGridControl ) )
.AddValueChanged( grid, grid_SelectedItemChanged );
结论
好了,各位,这就是全部内容。如果您喜欢这个应用程序,请投票。我会关注的!
历史
2008 年 3 月 6 日 | 首次发布 |
2009 年 4 月 23 日 | 错误修复 - 代码已更新 |